我有一個包含三列的網格 - 左、右和中間的網格拆分器。我需要隱藏其中一個面板。我需要為兩個 Splitter 列和 Panel 列設定 Width=0。但是,這種方法僅適用于代碼。當我使用
代碼如下所示。主要思想是將網格列的 Width 和 MaxWidth 屬性設定為 0,然后將面板設定為 *,將 Splitter 設定為 Auto。
1.它的作業方式(代碼隱藏):
private void TogglePanelVisibility(bool isVisible)
{
if (isVisible)
{
// Restore saved parameters:
_mainWindow.ColumnPanel.Width = new GridLength(_columnPanelWidth, GridUnitType.Star);
_mainWindow.ColumnPanel.MaxWidth = double.PositiveInfinity;
_mainWindow.ColumnSplitter.Width = new GridLength(_columnSplitterWidth, GridUnitType.Auto);
_mainWindow.ColumnSplitter.MaxWidth = double.PositiveInfinity;
return;
}
// Save parameters:
_columnSplitterWidth = _mainWindow.ColumnSplitter.Width.Value;
_columnPanelWidth = _mainWindow.ColumnPanel.Width.Value;
// Hide panel:
_mainWindow.ColumnPanel.Width = new GridLength(0);
_mainWindow.ColumnPanel.MaxWidth = 0;
_mainWindow.ColumnSplitter.Width = new GridLength(0);
_mainWindow.ColumnSplitter.MaxWidth = 0;
}
2.它不起作用的方式(XAML Style)
<Window.Resources>
<Style x:Key="showColumnStar" TargetType="{x:Type ColumnDefinition}">
<Style.Setters>
<Setter Property="Width" Value="*" />
<Setter Property="MaxWidth" Value="{x:Static system:Double.PositiveInfinity}" />
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding IsPanelVisible}" Value="False">
<DataTrigger.Setters>
<Setter Property="Width" Value="0" />
<Setter Property="MaxWidth" Value="0" />
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="showColumnAuto" TargetType="{x:Type ColumnDefinition}">
<Style.Setters>
<Setter Property="Width" Value="Auto" />
<Setter Property="MaxWidth" Value="{x:Static system:Double.PositiveInfinity}" />
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding IsPanelVisible}" Value="False">
<DataTrigger.Setters>
<Setter Property="Width" Value="0" />
<Setter Property="MaxWidth" Value="0" />
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<!-- ... -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" Style="{StaticResource showColumnAuto}" />
<ColumnDefinition Width="*" Style="{StaticResource showColumnStar}" />
</Grid.ColumnDefinitions>
<!-- ... -->
</Grid>
3. 最后一個使用價值轉換器的場景
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="{Binding IsPanelVisible, Converter={StaticResource BoolToGridSizeConverter}, ConverterParameter='Auto'}" />
<ColumnDefinition Width="{Binding IsPanelVisible, Converter={StaticResource BoolToGridSizeConverter}, ConverterParameter='*'}" />
</Grid.ColumnDefinitions>
<!-- ... -->
</Grid>
C#:
internal class BoolToGridRowColumnSizeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var param = parameter as string;
var unitType = GridUnitType.Star;
if (param != null && string.Compare(param, "Auto", StringComparison.InvariantCultureIgnoreCase) == 0)
{
unitType = GridUnitType.Auto;
}
return ((bool)value == true) ? new GridLength(1, unitType) : new GridLength(0);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我從除錯案例 #3 中學到的另一件事 - 在移動拆分器后嘗試顯示或隱藏面板時,Converted 只呼叫一次。
你能告訴我發生了什么嗎,為什么情況 #2 和 #3 不能正常作業?
演示專案的完整源代碼位于GitHub 上。
先感謝您!
uj5u.com熱心網友回復:
你能告訴我發生了什么嗎,為什么情況 #2 和 #3 不能正常作業?
因為GridSplitterset 和 local 值的Width屬性的ColumnDefinition本地值總是優先于樣式設定器值,如檔案中所述。
因此,您必須Width像在代碼隱藏中一樣設定屬性的本地值。
uj5u.com熱心網友回復:
我克隆了你的代碼:
至于#2:
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" Style="{StaticResource showColumnAuto}" />
<ColumnDefinition Width="Auto" Style="{StaticResource showColumnStar}" />
</Grid.ColumnDefinitions>
將第三列設定為“自動”就行了
#3:如果您除錯解決方案并在轉換器中設定斷點,您將看到,在第三個塊中移動拆分器后,轉換器僅到達一次,因此對于帶有拆分器的列。移動拆分器會破壞第三列上的寬度系結(正如@mm8 在他的回答中指出的那樣)。
因此,您要么設法在拆分器移動后重新定義系結(例如 PreviewMouseLeftButtonUp 事件),要么就放棄這種方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/378598.html
上一篇:數字鍵盤沒有出現
