2017-06-28 1 views
2

Ich habe einfach Usercontrol mit zwei Spalten und in der ersten Spalte Ich habe DataGrid:WPF Usercontrol-Komponente Grid Definition Ausgabe

<UserControl x:Class="Caliburn_SimpleInjector_Sample.ViewModel.ShellView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      MinWidth="1100" MinHeight="400"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width=".20*" /> 
      <ColumnDefinition Width="5" /> 
      <ColumnDefinition Width=".70*" /> 
     </Grid.ColumnDefinitions> 
     <DataGrid Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=Tasks, Mode=OneWay}" 
        SelectedItem="{Binding SelectedTask}" 
        AutoGenerateColumns="False" IsReadOnly="True" 
        CanUserResizeRows="False" GridLinesVisibility="None" 
        SelectionUnit="FullRow" 
        RowHeaderWidth="0" 
        FontSize="14"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Setter Property="BorderThickness" Value="0" /> 
        <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
       </Style> 
      </DataGrid.CellStyle> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Col 1" Binding="{Binding Find}" /> 
       <DataGridTextColumn Header="Col 2" Binding="{Binding Action}" /> 
       <DataGridTextColumn Header="Col 3" Binding="{Binding Status}" /> 
      </DataGrid.Columns> 
     </DataGrid> 

     <GridSplitter Grid.Row="0" Grid.Column="1" 
         VerticalAlignment="Stretch" 
         ResizeBehavior="PreviousAndNext" 
         Width="5" Background="#FFBCBCBC" /> 

     <StackPanel Grid.Row="0" Grid.Column="2" Background="Red"></StackPanel> 
    </Grid> 
</UserControl> 

Lassen Sie uns einen Blick darauf werfen, was wir haben: enter image description here

Perfect! Genau das brauche ich.

Aber! Wenn ich versuche, nur dynamisch einstellen Width für jede Spalte innerhalb von DataGrid, wird die ganze Vorlage gebrochen:

<DataGrid.Columns> 
    <DataGridTextColumn Width="0.2*" Header="Col 1 20%" Binding="{Binding Find}" /> 
    <DataGridTextColumn Width="0.2*" Header="Col 2 20%" Binding="{Binding Action}" /> 
    <DataGridTextColumn Width="0.6*" Header="Col 3 60%" Binding="{Binding Status}" /> 
</DataGrid.Columns> 

Und hier ist das Ergebnis: enter image description here

Und auch eine interessante Sache. Wenn Sie versuchen, die Größe des Fensters zu ändern, wird alles normal. Beispiel: ScreenCast

Könnte mir jemand bei diesem Problem helfen?

Vielen Dank im Voraus.

+0

Erfolgt dies, wenn Sie 'HorizontalAlignment =" Stretch "' für das Datenraster festlegen? – praty

+0

@Rostislav, können Sie auch Fenster Markup? Ich kann das Problem mit dem Kontrollcode – ASh

+1

@ASh nicht reproduzieren, hmmm ... Seltsam. Ich kann es auch nicht auf klarem WPF reproduzieren. Aber ich benutze Caliburn.Micro, und dieses Framework hat einen eigenen WindowManager, also haben wir vielleicht ein Problem dort. Code für die Reproduktion: [code.] (Https: // github.com/rolschewsky/Caliburn-SimpleInjector-Sample) –

Antwort

0

Haben Sie die Kombination von MinWidth und Width mit * probiert? Siehe Beispiel unten:

<DataGrid.Columns> 
<DataGridTextColumn MinWidth="0.2" Width="*" Header="Col 1 20%" Binding="{Binding Find}" /> 
<DataGridTextColumn MinWidth="0.2" Width="*" Header="Col 2 20%" Binding="{Binding Action}" /> 
<DataGridTextColumn MinWidth="0.6" Width="*" Header="Col 3 60%" Binding="{Binding Status}" /></DataGrid.Columns> 
+0

Ich habe versucht, aber es funktioniert immer noch nicht. –

0

Stellen Sie einfach die Steuerfensterbreite und Höhe

<UserControl x:Class="Caliburn_SimpleInjector_Sample.ViewModel.ShellView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      MinWidth="1100" MinHeight="400" 
      Width="1100" Height="400" 
      > 

Steuerung verhalten perfekt

+0

Ja, aber leider ist diese Option nicht für mich. Ich muss alle Komponenten "autoresisable" behalten. Wenn Sie diese "Breite" und "Höhe" definieren, hört "Autorisieren" auf zu arbeiten. Schauen Sie sich einfach den 'maximized window' Modus an (ohne' Width' und 'Height') (http://img.in6k.com/screens/Caliburn-SimpleInjector-Sample_2017-06-29_10-40-52.png) , [und mit] (http://img.in6k.com/screens/Caliburn-SimpleInjector-Sample_2017-06-29_10-41-59.png). Wie Sie sehen können, funktioniert 'Autoresize' nicht mehr, wenn wir' Breite' und 'Höhe' definieren, aber diese Funktion ist wichtig für mich. –

0

Das Problem in leeren Stackpanel liegt. Sie verwenden * für die dynamische DataGridTextColumn-Breite. nehmen

  • (Stern) zur Verfügung all verbleibenden Raum

Wie bei im Detail diskutiert: Meaning of * (asterisk) in a WPF ColumnDefinition? (weighted proportion of available space)

einfach die Stackpanel mit Kontrollen füllen oder eine Vorstellung zu bekommen, ersetzt die Stackpanel mit der Duplikat der DataGrid-Definition. Als Demo-Probe sein wird:

<UserControl x:Class="Caliburn_SimpleInjector_Sample.ViewModel.ShellView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      MinWidth="1100" MinHeight="400"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width=".20*" /> 
      <ColumnDefinition Width="5" /> 
      <ColumnDefinition Width=".70*" /> 
     </Grid.ColumnDefinitions> 
     <DataGrid Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=Tasks, Mode=OneWay}" 
        SelectedItem="{Binding SelectedTask}" 
        AutoGenerateColumns="False" IsReadOnly="True" 
        CanUserResizeRows="False" GridLinesVisibility="None" 
        SelectionUnit="FullRow" 
        RowHeaderWidth="0" 
        FontSize="14"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Setter Property="BorderThickness" Value="0" /> 
        <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
       </Style> 
      </DataGrid.CellStyle> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="0.2*" Header="Col 1 20%" Binding="{Binding Find}" /> 
       <DataGridTextColumn Width="0.2*" Header="Col 2 20%" Binding="{Binding Action}" /> 
       <DataGridTextColumn Width="0.6*" Header="Col 3 60%" Binding="{Binding Status}" /> 
      </DataGrid.Columns> 
     </DataGrid> 

     <GridSplitter Grid.Row="0" Grid.Column="1" 
         VerticalAlignment="Stretch" 
         ResizeBehavior="PreviousAndNext" 
         Width="5" Background="#FFBCBCBC" /> 

     <DataGrid Grid.Row="0" Grid.Column="2" ItemsSource="{Binding Path=Tasks, Mode=OneWay}" 
        SelectedItem="{Binding SelectedTask}" 
        AutoGenerateColumns="False" IsReadOnly="True" 
        CanUserResizeRows="False" GridLinesVisibility="None" 
        SelectionUnit="FullRow" 
        RowHeaderWidth="0" 
        FontSize="14"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Setter Property="BorderThickness" Value="0" /> 
        <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
       </Style> 
      </DataGrid.CellStyle> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="0.2*" Header="Col 1 20%" Binding="{Binding Find}" /> 
       <DataGridTextColumn Width="0.2*" Header="Col 2 20%" Binding="{Binding Action}" /> 
       <DataGridTextColumn Width="0.6*" Header="Col 3 60%" Binding="{Binding Status}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</UserControl> 

können Sie dann das Verhalten der Steuer beobachten korrekt ist, denn es gibt keinen Raum links von ersten Datenrasterspalten verbraucht werden.

+0

Ich habe diesen Fall bereits getestet und es funktioniert leider auch nicht. Noch schlimmer, in diesem Fall ist die Anwendung verrückt. : D Nachdem ich Ihr Beispiel ausgeführt habe, hat das Hauptfenster eine Breite bekommen, die der Breite von zwei meiner Displays entspricht, schauen Sie sich einfach an: [image.] (Http://img.in6k.com/screens/explorer_2017-06-30_10-45 -47.png) –