[英]How To Modify Grid Column Width Using Visual State in UWP?
為了顯示結果,我通過以下示例使用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>
值不受狀態影響。 請給我您的建議以解決此問題。
我認為Visual State無法處理您的案件。 在您的代碼中,您使用了VisualState.Setters
colBillId.Width
來更改列的寬度。 但是,在加載DataGrid
之后,可視樹中沒有名為colBillId
。 您可以在Visual Studio的實時可視樹中找到它:
對於每個DataGridTextColumn
,它都是一個ContentPresenter
,其中包含您在DataGridTextColumn.Header
設置的TextBlock
。 如您所見,它們沒有命名。 如果我們希望VisualState.Setters
的Setter
在顯示的頁面之后工作,則必須在可視樹中具有命名的控件。 作為測試,我們可以在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
中的Star(*)大小作為解決方法。 例如:
<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>
將x:name
屬性設置為要更改的“網格列”,然后在VisualStateManager中使用該名稱。讓我知道它是否有效!
我有一個適用於普通網格的解決方案,因此它也應適用於您的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>
然后在可視狀態代碼中訪問 Column,如下所示:
<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="MyDataGrid.Columns[0].Width"
代替編寫Target="colBillId.Width"
Target="MyDataGrid.Columns[0].Width"
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.