none
Im VisualBrush ein nicht sichbares UIElement ablegen RRS feed

  • Frage

  • Hallo Forum,

    ich habe eine Anwendung mit vielen Epander Elementen. In diesen sind Datagrids eingebettet. Für eine Print-Vorschau hat mir Andreas schon den Tipp mit dem VisualBrush gegeben.

    vb = New VisualBrush()
    rect = New Rectangle()
    vb.Visual = MyDataGrid
    rect.Width = MyDataGrid.ActualWidth 'DesiredSize.Width ... ist beim ersten Aufruf aber auch 0
    rect.Height = MyDataGrid.ActualHeight 'DesiredSize.Height ... ist beim ersten Aufruf aber auch 0
    rect.Fill = vb
    .......
    .......
    


    Nun ist es aber ja so, dass die Expander nicht zwingend geöffnet sein müssen, und dann bekomme ich für das Rectangel keine width und height.
    Ich vermute mal, weil das DataGrid nicht gerendert wird. Erst wenn ich einmal die Expander öffne und schliesse, dann erhalte ich eine Breite und Höhe. Noch dazu haben einige DataGrids einen horizontalen Bildlauf (im VisualBrush brauche ich aber das gesamte DG).

    Wie komme ich, trotz geschlossene Expander, an die richtige, maximale Grösse der DataGrids ran??

    Oder hat jemand eine andere Idee, wie eine PrintPreview, mit DataGrids und anderen grafischen Elementen, realisieren kann?

     

    Gruß HaGs

    PS: Ich arbeite mit .Net WPF VB

     

    Sonntag, 14. August 2011 08:26

Antworten

Alle Antworten

  • Hallo auch,

    Schuss in's Blaue: versuch's mal mit

    '...
    MyDataGrid.Measure(New Size(DeinExpander.Width, DeinExpander.Height))
    MyDataGrid.Arrange(New Rect)
    rect.Width = MyDataGrid.ActualWidth
    '...
    
    


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Sonntag, 14. August 2011 15:26
  • Hallo Olaf,

    danke für Dein Interesse.

    Das mit dem DataGrid.Measure() funktioniert nur ,wenn der Expander mindestend einamal geöffnet wird.

    Der Expander hat eine Breite von 288, mein DataGrid aber 430. Desshalb wird mir auch eine horizontale ScrollBar im DataGrid angezeigt.
    Wenn ich nun bei DataGrid.Measure() die Breite des Expander angebe, dann erhalte ich nur den halben Ausschnitt des DG (mit der hor. ScrollBar).
    Trage ich bei DataGrid.Measure() für die Breite 430 ein, dann erhalte ich mein komplettes DG (so sollte es sein!), nur ich muss den Breitenwert angeben !!

    Etwas ist noch komisch: Ich habe mehrere Expander, wo das DG breiter ist, wie die Expanderbreite (es wird eine ScrollBar angezeigt). Bei einigen dieser DG
    wird aber die richtige DG-Breite an meinen VisualBrush übergeben, auch ohne dass ich den Expander einmal göffnet habe (und damit auch richtig in meiner PrintPreview dargestellt). Hier mal die Definitionen der DG in XAML:

    Bei dieser Definition wird das DG richtig an den VisualBrush übergeben (d.h. in voller Breite)

    <Expander DockPanel.Dock="Top" Name="_exp_LKWFzgKompDaten" Margin="30,0,0,0"
                    Header="LKW Komponenten" MinWidth="288" Height="Auto"
                    HorizontalAlignment="Left" Background="#FFE9E9E9" BorderBrush="Black" >
    
                    <DataGrid DataContext="{Binding}"
                      ItemsSource="{Binding}" HeadersVisibility="Column"
                      AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" 
                      CanUserResizeRows="False" SelectionUnit="FullRow" SelectionMode="Single" CanUserReorderColumns="False"
                      CanUserSortColumns="False" Name="dg_LKWFzgKomponenten"
                      LostFocus="dg_LKWFzgKomponenten_LostFocus">
    
                      <DataGrid.ContextMenu>
                        <ContextMenu>
                          <MenuItem Command="{x:Static Menu_:_ApplCommands._DeleteRow}" Style="{StaticResource MenuItemStyle1}" />
                          <MenuItem Command="{x:Static Menu_:_ApplCommands._AddRowAbove}" Style="{StaticResource MenuItemStyle1}" />
                        </ContextMenu>
                      </DataGrid.ContextMenu>
    
                      <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Path=Nr}" Header="Nr" MinWidth="20"
                          ElementStyle="{Binding Source={StaticResource RightAlignStyle}}"
                          IsReadOnly="True" />
                        <DataGridTemplateColumn Header="S" MinWidth="16">
                          <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                              <Grid>
                                <CheckBox IsChecked="{Binding Path=Wahl}" Click="_cb_LKWFzgComp_Click" x:Name="_DataGridFzgComp_cb"
                                  Tag="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                              </Grid>
                            </DataTemplate>
                          </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Binding="{Binding Path=Benennung}" Header="Benennung" MinWidth="155"/>
                        <DataGridTextColumn Binding="{Binding Path=Gewicht, StringFormat=N1}" Header="Gewicht"
                          ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="50" />
                        <DataGridTextColumn Binding="{Binding Path=X, StringFormat=N1}" Header="X [mm]"
                          ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="50" />
                        <DataGridTextColumn Binding="{Binding Path=VAAnteil, StringFormat=N1}" Header="VA Anteil"
                          ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="50" />
                        <DataGridTextColumn Binding="{Binding Path=HAAnteil, StringFormat=N1}" Header="HA Anteil"
                          ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="50" />
                        <DataGridTextColumn Binding="{Binding Path=Einheit}" Header="ME"
                          ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="25" />
    
                      </DataGrid.Columns>
                    </DataGrid>
                  </Expander>

    Bei dieser Definition wird nur der sichbare Teil der ScrollView an den VisualBrush übergeben (d.h. nur ca das halbe DG wird in angezeigt). Hier ist auch noch ein Expander im Expander ! Ist das der Grund ? Ich musste hier den Umweg über ein StackPanel machen, weil ich sonst eine Fehlermeldung in XAML erhalte!

    <Expander DockPanel.Dock="Top" Name="_exp_LKWNuLaDaten" Margin="30,0,0,0"
                    Header=" LKW Nutzlast Komponenten" Width="288" Height="Auto"
                    HorizontalAlignment="Left" Background="#FFE9E9E9" BorderBrush="Black" IsExpanded="false" >
                    
                    <!-- Nutzlast Daten Tables -->
                    <StackPanel Name="_stp_Nr1">
                      <!-- Nutzlast Daten Info Table -->
                      <Expander DockPanel.Dock="Top" Name="_exp_LKWNuLaDatenInfo" Margin="20,0,0,0"
                        Header="Nutzlast-Infos " MinWidth="265" Height="Auto"
                        HorizontalAlignment="Left" Background="#FFE9E9E9" BorderBrush="Black">
                        <StackPanel>
                        <!-- Nutzlast Infos -->
                        <DataGrid DataContext="{Binding}"
                          ItemsSource="{Binding}" HeadersVisibility="Column" ColumnHeaderStyle="{Binding Source={StaticResource ColumnHeaderStyle1}}"
                          AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" 
                          CanUserResizeRows="False" SelectionUnit="FullRow" SelectionMode="Single" CanUserReorderColumns="False"
                          CanUserSortColumns="False" Name="dg_LKWNuLaInfo" CellEditEnding="_dg_LKWNuLaInfo_CellEditEnding" >
    
                          <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Path=Nutzlast}" Header="verbleibende Nutzlast"
                              ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" MinWidth="105" IsReadOnly="True" />
    
                            <DataGridTextColumn Binding="{Binding Path=Gewicht, StringFormat=N1}" Header="[kg]"
                              ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="55" IsReadOnly="True" />
    
                            <DataGridTextColumn Binding="{Binding Path=Teile, StringFormat=N0}" Header="Teile"
                              ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" MinWidth="35" />
    
                            <DataGridTemplateColumn Header="Übernehmen" MinWidth="66">
                              <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                  <Grid>
                                    <CheckBox IsChecked="{Binding Path=Wahl}" Name="_DataGridLKWNulaInfo_cb" Click="_cb_LKWNulaInfo_Click"
                                      Tag="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                      </Grid>
                                    </DataTemplate>
                                  </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                              </DataGrid.Columns>
                        </DataGrid>
    
                        <!-- Nutzlast Splitting -->
                        <DataGrid DataContext="{Binding}"
                          ItemsSource="{Binding}" HeadersVisibility="Column" ColumnHeaderStyle="{Binding Source={StaticResource ColumnHeaderStyle1}}"
                          AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" 
                          CanUserResizeRows="False" SelectionUnit="FullRow" SelectionMode="Single" CanUserReorderColumns="False"
                          CanUserSortColumns="False" Name="dg_LKWNulaSplitting" Visibility="Collapsed" CellEditEnding="_dg_LKWNulaSplitting_CellEditEnding">
    
                          <DataGrid.Columns>
                            <DataGridTemplateColumn Header="Wahl" MinWidth="28">
                              <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                  <Grid>
                                    <CheckBox IsChecked="{Binding Path=Wahl}" Name="_DataGridLKWNulaSplitting_cb" Click="_cb_LKWNulaSplitting_Click"
                                      Tag="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                  </Grid>
                                </DataTemplate>
                              </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
    
                            <DataGridTextColumn Binding="{Binding Path=Teil}" Header="NuLa Teil"
                              ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" MinWidth="55" IsReadOnly="True" />
    
                            <DataGridTextColumn Binding="{Binding Path=Prozent, StringFormat=N2}" Header="[%]"
                              ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="50" IsReadOnly="false" />
    
                            <DataGridTextColumn Binding="{Binding Path=Gewicht, StringFormat=N1}" Header="Gewicht [kg]"
                              ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" MinWidth="65" />
    
                            <DataGridTextColumn Binding="{Binding Path=Bemerkung}" Header="Bemerkung" MinWidth="65" />
    
                          </DataGrid.Columns>
                        </DataGrid>
                        </StackPanel>
                      </Expander>
                      <!-- Nutzlast Daten -->
                      <DataGrid DataContext="{Binding}"
                        ItemsSource="{Binding}" HeadersVisibility="Column"
                        AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" 
                        CanUserResizeRows="False" SelectionUnit="FullRow" SelectionMode="Single" CanUserReorderColumns="False"
                        CanUserSortColumns="False" Name="dg_LKWNuLaKomponenten"
                        LostFocus="dg_LKWNuLaKomponenten_LostFocus">
    
                        <DataGrid.ContextMenu>
                          <ContextMenu>
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._DeleteRow}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._AddRowAbove}" Style="{StaticResource MenuItemStyle1}" />
                            <Separator />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_VA_CurrentValue}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_HA_CurrentValue}" Style="{StaticResource MenuItemStyle1}" />
                            <Separator />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._MaxNuLa_VA_bei_X}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._MaxNuLa_HA_bei_X}" Style="{StaticResource MenuItemStyle1}" />
                            <Separator />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_VA_GG}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_HA_GG}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_VA_TG}" Style="{StaticResource MenuItemStyle1}" />
                            <MenuItem Command="{x:Static Menu_:_ApplCommands._OptNuLaSP_HA_TG}" Style="{StaticResource MenuItemStyle1}" />
    
                          </ContextMenu>
                        </DataGrid.ContextMenu>
                        <DataGrid.Columns>
                          <DataGridTextColumn Binding="{Binding Path=Nr}" Header="Nr" MinWidth="20"
                            ElementStyle="{Binding Source={StaticResource RightAlignStyle}}"
                            IsReadOnly="True" />
    
                          <DataGridTemplateColumn Header="S" MinWidth="16">
                            <DataGridTemplateColumn.CellTemplate>
                              <DataTemplate>
                                <Grid>
                                  <CheckBox IsChecked="{Binding Path=Wahl}" Click="_cb_LKWNulaData_Click" x:Name="_cb_DataGridLKWNula"
                                    Tag="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                </Grid>
                              </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                          </DataGridTemplateColumn>
    
                          <DataGridTextColumn Binding="{Binding Path=Benennung}" Header="Benennung" Width="155"/>
                          <DataGridTextColumn Binding="{Binding Path=Gewicht, StringFormat=N1}" Header="Gewicht"
                            ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="50" />
                          <DataGridTextColumn Binding="{Binding Path=X, StringFormat=N1}" Header="X [mm]"
                            ElementStyle="{Binding Source={StaticResource TextAlignRightStyle}}" MinWidth="50" />
                          <DataGridTextColumn Binding="{Binding Path=VAAnteil, StringFormat=N1}" Header="VA Anteil"
                            ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="50" />
                          <DataGridTextColumn Binding="{Binding Path=HAAnteil, StringFormat=N1}" Header="HA Anteil"
                            ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="50" />
                          <DataGridTextColumn Binding="{Binding Path=Einheit}" Header="ME"
                            ElementStyle="{Binding Source={StaticResource RightAlignStyle}}" IsReadOnly="True" MinWidth="25" />
    
                        </DataGrid.Columns>
    
                      </DataGrid>
                    </StackPanel>
                  </Expander>


    Dazu fällt mir noch ein:
    Wenn mir das DG in einem ScrollViewer angezeigt wird, dann muss es doch möglich sein an das ganze DG ran zu kommen (Stichwort Viewport, View) ???

    Aber wie?

    Sonntag, 14. August 2011 18:45
  • Hallo nochmal,

    ich würde wohl versuchen, die layout-passes (measure+arrange) zus./vorher für den Scrollviewer mit den Werten auszuführen, die das DataGrid benötigt, um alles darstellen zu können.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Montag, 15. August 2011 06:48
  • Hallo HaGs151,

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Donnerstag, 18. August 2011 08:30
    Moderator
  • Hallo HaGs151,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 24. August 2011 08:45
    Moderator