Ich habe mich jetzt erstmals richtig an WPF herangewagt.
Ich habe den XAML-Code auf das wesentliche gekürzt:
Spoiler anzeigen
Das sieht dann so aus:
Die Daten kommen in dieser Form ins Programm:
Für jede dieser Zeilen wird im ItemsControl eine GrupBox mit 6 TextBoxen erstellt.
Die Höhen der RowDefinitions sind an Properties gebunden, damit man sie ausblenden kann (0 / Auto).
Das funktioniert mit 40 Zeilen noch ganz gut, aber sobald man über 60 hinaus geht, fängt es an, stark zu ruckeln, wenn man die Größe des Fensters ändert:
Leider gibt es nur das SizeChanged-Event, und nicht wie bei Forms auch ein ResizeBegin- und ResizeEnd-Event. Ich habe versucht, beim ersten Auslösen des SizeChanged-Events die ganzen Elemente auszublenden (die Visibility des DockPanels auf Collapsed zu setzen) und ein paar Millisekunden nach dem letzten Auslösen die Elemente wieder anzuzeigen. Aber das Problem dabei ist, dass dieses Event erst ausgelöst wird, wenn es bereits zu spät ist. Zuerst wird einmal gelayoutet und dann werden die Elemente ausgeblendet. Das bringt natürlich nichts.
Dazu also meine Fragen: Habe ich WPF überschätzt? Oder mache ich irgendwas falsch?
Wie kann ich das Problem mit dem Flackern beheben?
Ich habe den XAML-Code auf das wesentliche gekürzt:
XML-Quellcode
- <Window
- xmlns:t="clr-namespace:Tags3"
- SizeChanged="OnMainWindowSizeChanged"
- >
- <Window.Resources>
- <!-- 5 Styles -->
- </Window.Resources>
- <Window.DataContext>
- <t:MainWindowViewModel/>
- </Window.DataContext>
- <Grid>
- <TextBlock Visibility="{Binding Path=ResizingViewVisible}">Größenänderung...</TextBlock>
- <Grid Visibility="{Binding Path=LoadingTranslationsViewVisible}">
- <TextBlock>Lade Übersetzungen...</TextBlock>
- <ProgressBar Maximum="{Binding Path=LoadTranslationsMaximum}" Value="{Binding Path=LoadTranslationsProgress}"/>
- </Grid>
- <DockPanel Visibility="{Binding Path=TranslationsViewVisible}">
- <Menu DockPanel.Dock="Top">
- <!-- Ein paar MenuItems -->
- </Menu>
- <ScrollViewer>
- <ItemsControl ItemsSource="{Binding Path=Texts}">
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <StackPanel />
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <GroupBox Header="{Binding Path=LineNumberString}">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="80"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="{Binding Path=TaggedOriginalRowHeight}"/>
- <RowDefinition Height="{Binding Path=SplittedOriginalRowHeight}"/>
- <RowDefinition Height="{Binding Path=PlainOriginalRowHeight}"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="{Binding Path=SplittedTranslationRowHeight}"/>
- <RowDefinition Height="{Binding Path=TaggedTranslationRowHeight}"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Column="0" Grid.Row="0">Mit Tags:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=TaggedOriginal}"/>
- <TextBlock Grid.Column="0" Grid.Row="1">Aufteilung:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=SplittedOriginal}"/>
- <TextBlock Grid.Column="0" Grid.Row="2">Ohne Tags:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=PlainOriginal}"/>
- <TextBlock Grid.Column="0" Grid.Row="3">Übersetzung:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="3" Text="{Binding Path=PlainTranslation, UpdateSourceTrigger=PropertyChanged}"/>
- <TextBlock Grid.Column="0" Grid.Row="4">Aufteilung:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="4" Text="{Binding Path=SplittedTranslation}"/>
- <TextBlock Grid.Column="0" Grid.Row="5">Mit Tags:</TextBlock>
- <TextBox Grid.Column="1" Grid.Row="5" Text="{Binding Path=TaggedTranslation}"/>
- </Grid>
- </GroupBox>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- </ScrollViewer>
- </DockPanel>
- </Grid>
- </Window>
Das sieht dann so aus:
Die Daten kommen in dieser Form ins Programm:
Quellcode
- Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,,
- Dialogue: 10,0:00:22.69,0:00:23.63,Default,Mar,0,0,0,,{\an8}Nun,
- Dialogue: 10,0:00:23.63,0:00:28.25,Default,Mar,0,0,20,,{\an8}beginnen wir mit der Besprechung des Angriffs, den wir bald starten werden.
- Dialogue: 10,0:00:44.27,0:00:49.52,Default,Dad,0,0,0,,{\i1}Du sollst hier nicht deine Zeit verschwenden.{\i0}
Für jede dieser Zeilen wird im ItemsControl eine GrupBox mit 6 TextBoxen erstellt.
Die Höhen der RowDefinitions sind an Properties gebunden, damit man sie ausblenden kann (0 / Auto).
Das funktioniert mit 40 Zeilen noch ganz gut, aber sobald man über 60 hinaus geht, fängt es an, stark zu ruckeln, wenn man die Größe des Fensters ändert:
Leider gibt es nur das SizeChanged-Event, und nicht wie bei Forms auch ein ResizeBegin- und ResizeEnd-Event. Ich habe versucht, beim ersten Auslösen des SizeChanged-Events die ganzen Elemente auszublenden (die Visibility des DockPanels auf Collapsed zu setzen) und ein paar Millisekunden nach dem letzten Auslösen die Elemente wieder anzuzeigen. Aber das Problem dabei ist, dass dieses Event erst ausgelöst wird, wenn es bereits zu spät ist. Zuerst wird einmal gelayoutet und dann werden die Elemente ausgeblendet. Das bringt natürlich nichts.
Dazu also meine Fragen: Habe ich WPF überschätzt? Oder mache ich irgendwas falsch?
Wie kann ich das Problem mit dem Flackern beheben?
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils