Hiding/Showing 一个用户控件 WPF
Hiding/Showing a UserControl WPF
我正在构建 WPF MVVM 应用程序。
我有:
我有一个 ShellWindow
看起来像这样:
它由两行组成:
1:带有Height="*"
的汉堡包菜单(不重要)
2:带Height="100"
的控制台
控制台是 UserControl
:
<UserControl
//namespaces>
<Grid Name="LoggingGrid" Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Margin="{StaticResource SmallLeftMargin}">
<Button
x:Name="CollapseBtn"
Width="25"
Height="25"
Click="CollapseBtn_Click"
Content="▲">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse Fill="White" />
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<StackPanel Margin="5,0,0,0" Orientation="Horizontal">
<Image
Height="25"
Source="/Images/console-icon.png"
Visibility="Visible" />
<Label
Content="Console"
FontSize="16"
Foreground="White" />
</StackPanel>
</TextBlock>
<Border Grid.Row="1">
<ListView
x:Name="LoggingList"
Margin="5"
Background="Black"
BorderThickness="0"
Foreground="White"
ItemsSource="{Binding Logs, UpdateSourceTrigger=PropertyChanged}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
</Border>
</Grid>
</UserControl>
我把不重要的东西省略了。
我想做的事情:
只要用户点击按钮,控制台就会折叠起来,看起来像这样:
箭头也改了
我该如何实施?使用 MVVM 的最佳方法是什么?
我试过的:
我尝试在后面的代码中使用按钮单击事件处理程序 - CollapseBtn_Click
,看看会发生什么:
private void CollapseBtn_Click(object sender, System.Windows.RoutedEventArgs e)
{
LoggingGrid.Visibility = System.Windows.Visibility.Hidden;
}
显然它删除了用户控件并在原来的位置留下了白色背景。
不应将整个 LoggingGrid 的 Visibility
设置为 Hidden
,而应将 LoggingList 的 Visibility
设置为 Collapsed
。 (隐藏和折叠的区别见这里:Difference between Visibility.Collapsed and Visibility.Hidden)。
根据您在 ShellWindow 中的布局,您可能必须调整 UserControl 中的行高配置,以便折叠的 LoggingGrid 导致一行高度为零。
关于 MVVM,最好的方法是将 Button 绑定到 ViewModel 上的 bool 属性 ConsoleVisible
,这样单击按钮就会在 true 和 false 之间切换 属性。按钮的样式可以绑定到相同的属性。对于 LoggingList 可见性,您可以在 属性.
上使用带有 BooleanToVisibilityConverter
的绑定
我正在构建 WPF MVVM 应用程序。
我有:
我有一个 ShellWindow
看起来像这样:
它由两行组成:
1:带有Height="*"
2:带Height="100"
控制台是 UserControl
:
<UserControl
//namespaces>
<Grid Name="LoggingGrid" Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Margin="{StaticResource SmallLeftMargin}">
<Button
x:Name="CollapseBtn"
Width="25"
Height="25"
Click="CollapseBtn_Click"
Content="▲">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse Fill="White" />
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<StackPanel Margin="5,0,0,0" Orientation="Horizontal">
<Image
Height="25"
Source="/Images/console-icon.png"
Visibility="Visible" />
<Label
Content="Console"
FontSize="16"
Foreground="White" />
</StackPanel>
</TextBlock>
<Border Grid.Row="1">
<ListView
x:Name="LoggingList"
Margin="5"
Background="Black"
BorderThickness="0"
Foreground="White"
ItemsSource="{Binding Logs, UpdateSourceTrigger=PropertyChanged}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
</Border>
</Grid>
</UserControl>
我把不重要的东西省略了。
我想做的事情:
只要用户点击按钮,控制台就会折叠起来,看起来像这样:
箭头也改了
我该如何实施?使用 MVVM 的最佳方法是什么?
我试过的:
我尝试在后面的代码中使用按钮单击事件处理程序 - CollapseBtn_Click
,看看会发生什么:
private void CollapseBtn_Click(object sender, System.Windows.RoutedEventArgs e)
{
LoggingGrid.Visibility = System.Windows.Visibility.Hidden;
}
显然它删除了用户控件并在原来的位置留下了白色背景。
不应将整个 LoggingGrid 的 Visibility
设置为 Hidden
,而应将 LoggingList 的 Visibility
设置为 Collapsed
。 (隐藏和折叠的区别见这里:Difference between Visibility.Collapsed and Visibility.Hidden)。
根据您在 ShellWindow 中的布局,您可能必须调整 UserControl 中的行高配置,以便折叠的 LoggingGrid 导致一行高度为零。
关于 MVVM,最好的方法是将 Button 绑定到 ViewModel 上的 bool 属性 ConsoleVisible
,这样单击按钮就会在 true 和 false 之间切换 属性。按钮的样式可以绑定到相同的属性。对于 LoggingList 可见性,您可以在 属性.
BooleanToVisibilityConverter
的绑定