|
I have a bunuch of styles in App.xaml. In just about each, I have this trigger. It enabled the element (Textbox, checkbox, listbox, etc) when the user clicked Edit, AND, if the use has rights. It works well.
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding AreFieldsEnabled}" Value="True" />
<Condition Binding="{Binding CanUserEdit}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsEnabled" Value="True" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
The problem is that it's copied & pasted into each of the elements. How can I define this somewhere and resuse it in each element I need it in?
Thanks
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
hi i have problem load usercontrol in background worker,can anyone help me?
this is my code
Private Sub bwstartup_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwstartup.DoWork
'load some data
LoadData()
bwstartup.ReportProgress(15)
LoadData2()
bwstartup.ReportProgress(20)
Dispatcher.Invoke(Sub() LoadUserControl())
bwstartup.ReportProgress(30)
Dispatcher.Invoke(Sub() LoadUserControl2())
bwstartup.ReportProgress(40)
End Sub
Private Sub bwstartup_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bwstartup.ProgressChanged
loadingbar.Value = e.ProgressPercentage
End Sub
Private Sub bwstartup_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bwstartup.RunWorkerCompleted
End Sub
the problem is:
its work on reportprogress(15) to reportprogress(20)
but then freeze until completed LoadUserControl2
so reportprogress(30) is not showing.
thx
|
|
|
|
|
It's your "load" routines that are the problem (and any other code you are not showing).
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
sorry if my information is not complete.it just because on
my "load" routines have full code,it will have long if i paste here.
it is a window contain input form.
i finally solve the problem with changing this :
Dispatcher.Invoke(Sub()
LoadUserControl())
bwstartup.ReportProgress(30)
to this :
action = Sub() LoadUserControl()
Dispatcher.Invoke(DispatcherPriority.Background, action)
bwstartup.ReportProgress(30)
the progressbar start to update again.
thx for the reply
|
|
|
|
|
The code you posted doesn't have anything to do with the problem as far as we can tell.
If you're trying to create and manipulate controls in the background worker, you can't. Controls have to be created on the UI thread, the thread your app started on.
If you're adding data to controls, you cannot do it from a background worker. You cannot touch or modify controls from anything other than the UI thread.
You can load the data you need into data structures in the background worker, but adding that data to controls must be done on the UI thread.
|
|
|
|
|
the problem i want try to solve is like this:
i create application with have some inputform/window
on my button if i call inputform.show the ui is freeze for 0.xx second
cause it have many control inside
so i try to preload the inputform/window n put progressbar to show
to the user.
thx for reply
|
|
|
|
|
How many controls are you talking about?
What do you mean by "preload"? Are you creating a lot of controls? If so, you really need to rethink your form design. If you're loading a lot of data into these controls, again, you really need to rethink your form design. For example, there is no point in loading 100,000 items into a dropdown list. No user will ever put up with using that.
|
|
|
|
|
"preload",i mean is load the modul/window in background at starting program
i can't rethink my form design.cause its not have many control maybe below 20,but every control have to
load data from server so it takes time to completed.
modified 11-Sep-20 0:51am.
|
|
|
|
|
How much data are you talking about?
|
|
|
|
|
Not much about 10.000 rows
But the data is not the problem cause i use backgroundworker to load,the freezing ui when show window that i feel not smooth
|
|
|
|
|
Yeah, you DO NOT load controls with 10,000 records. No user on this planet will put up with scrolling through that much data to find what they want.
There's you're problem.
|
|
|
|
|
but they can search using keyboard,i mean like using combobox then populate all product. so i need to load all the record first.
isn't that right?
|
|
|
|
|
No, it's not.
You take the characters typed in the textbox to have the database return the top 25 to 50 or so records that match the typed characters and populate the dropdown with just those results.
|
|
|
|
|
if i do like that, then every time user typed in textbox,its need to open connection to the server and search the matching text and user needs to tab to search again in dropdownlist.
i think this is not effective... cause it will have problem if the connection is not stable
thx for your suggestion
|
|
|
|
|
Yeah, and that's the only method that's really going to work for you. Pre-loading the control with tens of thousands of records takes time. There is no way to speed it up and the problem only gets worse with more and more data over time.
You have no choice but to filter the records some how.
|
|
|
|
|
I usually launch a few ASYNC data loads on my app's startup. Often these are user controls loaded with serialized data (xml) from a previous session.
The collections loaded are usually Observable collections.
Then when the "host" list view, etc. is loaded via a page, window or uc, the data sources are connected; even while the async load might be running.
Nothing wrong with your pattern: it's what mostly drives UWP (async).
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
thank you, i think your method is more efficient..
|
|
|
|
|
Listen to Dave, take the first 2-3 (I usually use 3) characters from the user to filter the query to the database, I have found that 3 characters almost always reduces the data load to a manageable volume.
I use a textbox and a button so the user enters a filter and then clicks the button, there is no doubt the result is a filter view of the data. The idea of loading 10k records is ludicrous.
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
10k record i think is not too much,if i load it in async only takes about 2-3 second.
then the user can search it locally.
if i use textbox and button.it will always reconnect to server for the query.it will slower the input
process...
thx
|
|
|
|
|
I do text to voice "transliteration" in real-time using 4 dictionaries at the same time; the largest of which has 80,000 entries (English).
The load times are inconsequential. One can't generalize.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
so it loads 80k entries at startup n create local xml?
then the user will have search time based on hardware processor
|
|
|
|
|
The dictionaries are the one case re: generalizations about "record counts".
The Xml refers to the case where users create "object graphs"; serializing / deserializing graphs as xml is simpler that writing / reading a bunch of related records. The end results is the same: collections of data (for data templating), or data and uc's for more complex list views.
And I do "virtualization" when necessary: I may have 20,000 (data) records loaded, but since I know my "view port size" and "position", I can create controls on the fly as the user is scrolling (async again). The performance depends on "preloading" because the user can also hyperlink with no lag.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Then the loading is not done a separate thread, or the synchronization isn't done well. Dave has a point, you don't show 10k records in a dropdown, as the scrolling would be awful. You have a point that for a fast tekst search, you preload it - it's not like it's a lot of data.
There's some differences between WinForms and WPF, so can't help there; but I'd not be reporting progress with constants that indicate little; I'd be counting items and updating the progressbar every 250ms.
It's a shortcut to give "partial" progress with constants, and it smells.
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hi Team,
I want my window to be closed like SHAPE animation in PowerPoint. I have written below code but it's not working like SHAPE animation present in Microsoft PowerPoint. It is going from outer to inner but in rectangle shape. I have to keep Outer to inner behavior but with SHAPE animation.
Below is the code I have created:
MainWindow.XAML
<Window.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="rectScale"/>
</TransformGroup>
</Window.RenderTransform>
<Window.Resources>
and in .cs file
DoubleAnimation scale_x = new DoubleAnimation()
{
From = 1,
To = 0,
Duration = TimeSpan.FromSeconds(5),
};
DoubleAnimation scale_y = new DoubleAnimation()
{
From = 1,
To = 0,
Duration = TimeSpan.FromSeconds(5),
};
DoubleAnimation center_x = new DoubleAnimation()
{
From = 400,
To = 400,
Duration = TimeSpan.FromSeconds(5),
};
DoubleAnimation center_y = new DoubleAnimation()
{
From = 300,
To = 300,
Duration = TimeSpan.FromSeconds(5),
};
rectScale.BeginAnimation(ScaleTransform.ScaleXProperty, scale_x);
rectScale.BeginAnimation(ScaleTransform.ScaleYProperty, scale_y);
rectScale.BeginAnimation(ScaleTransform.CenterXProperty, center_x);
rectScale.BeginAnimation(ScaleTransform.CenterYProperty, center_y);
Can someone please guide where I am missing and how can I make it working.
Thanks
|
|
|
|
|
I am making a table, using a grid, with one large left column, and to the right, four (or possibly more) check boxes / radio buttons, each in a quite narrow grid column. There is not enough room to label each of the CBs/RBs on every line, so I put the label in the top row, rotated 270 degrees as a vertical text, in a tall (100 units) but narrow (27 units) cell, just enough to hold the longest label.
My problem is that WPF appearently clips the label to the edges of the grid cell before rotating the contents, so in my first attempt, the label was clipped at 27 units while it was horizontal, and then this less-that-a-third of the label was rotated to vertical position. I discovered that I could use Grid.ColumnSpan="4" to give the labels enough horizontal space to be drawn in full before rotating. That works only if three extra columns exist, and that holds true only for the first radio button. So I have to place all four of them in column 1 (spanning cols 1-4), and then translate them horizontally to appear visually over their intended columns.
This is ugly, messy, inflexible and most certainly not something I would like to maintain in the future, with columns added, widths/heights adjusted, labels changed...:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="120" />
<RowDefinition Height="27" />
<RowDefinition Height="27"/>
<RowDefinition Height="27"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="27"/>
<ColumnDefinition Width="27"/>
<ColumnDefinition Width="27"/>
<ColumnDefinition Width="27"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Content="Slett permanent" Height="120" Width="120" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Center" >
<Label.RenderTransform>
<TransformGroup>
<RotateTransform Angle="270"/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Content="Hopp over" Height="120" Width="120" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Center" >
<Label.RenderTransform>
<TransformGroup>
<RotateTransform Angle="270"/>
<TranslateTransform X="27"/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Content="Legg inn i SiKo" Height="120" Width="120" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Center">
<Label.RenderTransform>
<TransformGroup>
<RotateTransform Angle="270"/>
<TranslateTransform X="54"/>
</TransformGroup>
</Label.RenderTransform>
</Label>
<Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" Content="Kopier til kildedisk" Height="120" Width="120" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Center">
<Label.RenderTransform>
<TransformGroup>
<RotateTransform Angle="270"/>
<TranslateTransform X="81"/>
</TransformGroup>
</Label.RenderTransform>
</Label> Then follows code to fill the rows of the table below this top row.
There must be a simpler and better way to write a vertical (270 degrees rotated) text label over a column! But how?
(As you may see, I am certainly not a guru in XAML programming, so please be kiond to me )
|
|
|
|
|