为了显示结果,我按照下面提到的示例使用MyToolKit包的数据网格:https://github.com/MyToolkit/MyToolkit/wiki/DataGrid
使用此网格我可以显示结果。为了使网格响应,我想设置两个不同的列宽。一个是缩小状态,另一个是广州。 我在这里添加网格和可视状态代码
<controls:DataGrid.Columns>
<controls:DataGridTextColumn Binding="{Binding billId}" d:DataContext="{d:DesignInstance Type=models:PendingBillDetail}" x:Name="colBillId" >
<controls:DataGridTextColumn.Header>
<TextBlock Name="txtBillId" Text="BillId" Foreground="Green" />
</controls:DataGridTextColumn.Header>
</controls:DataGridTextColumn>
</controls:DataGrid.Columns>
视觉状态代码
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="wideView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="641" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="colBillId.Width" Value="200" />
<Setter Target="svPendingBillsList.VerticalScrollBarVisibility" Value="Disabled" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="narrowView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="colBillId.Width" Value="10" />
<Setter Target="svPendingBillsList.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Target="svPendingBillsList.VerticalScrollBarVisibility" Value="Disabled" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
值根据州不影响。 请给我你解决这个问题的建议。
答案 0 :(得分:1)
我认为视觉状态不能适用于您的情况。在您的代码中,您使用colBillId.Width
中的VisualState.Setters
来更改列的宽度。但是在加载DataGrid
之后,名为colBillId
的可视树中没有控件。您可以在Visual Studio的实时可视树:
对于每个DataGridTextColumn
,它是ContentPresenter
,其中包含您在TextBlock
中设置的DataGridTextColumn.Header
。正如你所看到的,他们没有被命名。如果我们希望Setter
中的VisualState.Setters
在页面显示后工作,我们必须在可视树中使用命名控件。作为测试,我们可以在Visual State中使用以下代码:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="wideView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="641" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="colBillId.Width" Value="200" />
<Setter Target="txtBillId.Foreground" Value="Red" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="narrowView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="colBillId.Width" Value="50" />
<Setter Target="txtBillId.Foreground" Value="Green" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
如果页面的宽度大于“641”,您会发现“BillId”变为红色。但是列的宽度不会改变。所以在你的情况下,Visual State无法工作。
正如Mirko Bellabarba所说,我建议您在Width
中使用星号(*)作为解决方法。例如:
<controls:DataGrid.Columns>
<controls:DataGridTextColumn Width="*" Binding="{Binding billId}" d:DataContext="{d:DesignInstance Type=models:PendingBillDetail}">
<controls:DataGridTextColumn.Header>
<TextBlock Name="txtBillId" Foreground="Green" Text="BillId" />
</controls:DataGridTextColumn.Header>
</controls:DataGridTextColumn>
<controls:DataGridTextColumn Width="2*" Binding="{Binding billId}" d:DataContext="{d:DesignInstance Type=models:PendingBillDetail}">
<controls:DataGridTextColumn.Header>
<TextBlock Foreground="Green" Text="BillId" />
</controls:DataGridTextColumn.Header>
</controls:DataGridTextColumn>
</controls:DataGrid.Columns>
答案 1 :(得分:0)
将x:name
属性设置为要更改的网格列,然后在VisualStateManager中使用该名称
让我知道它是否有效!
答案 2 :(得分:0)
我有一个适用于普通网格的解决方案,因此它也适用于您的DataGrid。
为您的 DataGrid命名,例如:
<controls:DataGrid x:Name="MyDataGrid">
<controls:DataGrid.Columns>
<controls:DataGridTextColumn Binding="{Binding billId}" d:DataContext="{d:DesignInstance Type=models:PendingBillDetail}" x:Name="colBillId" >
<controls:DataGridTextColumn.Header>
<TextBlock Name="txtBillId" Text="BillId" Foreground="Green" />
</controls:DataGridTextColumn.Header>
</controls:DataGridTextColumn>
</controls:DataGrid.Columns>
</controls:DataGrid>
然后在可视状态代码:
中访问此列<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="wideView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="641" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="MyDataGrid.Columns[0].Width" Value="200" />
<Setter Target="svPendingBillsList.VerticalScrollBarVisibility" Value="Disabled" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="narrowView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="MyDataGrid.Columns[0].Width" Value="10" />
<Setter Target="svPendingBillsList.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Target="svPendingBillsList.VerticalScrollBarVisibility" Value="Disabled" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
因此,您必须将列作为可索引处理。因此,您应该使用Target="colBillId.Width"
Target="MyDataGrid.Columns[0].Width"
希望有所帮助。