【发布时间】:2014-07-14 19:56:33
【问题描述】:
我目前正在从事一个工作项目。我正在寻求外部设计意见,以及关于我所面临问题的一些一般信息。
我们有一个位于项目根目录中的 MainWindow.xaml 文件。在这个主窗口中是一些折叠堆栈面板、功能区工具栏等的设计和逻辑。
到目前为止,我们的想法是在每个堆栈面板中包含一个不同的面板,以帮助使代码整洁。视图位于“视图”文件夹中。所以为了清楚起见,MainWindow.xaml 和其他视图不在同一个目录中。如有必要,这是可以更改的。
所以这是我的问题/问题:我们有一个窗口('A'),一个带有可折叠堆栈面板的主面板,其中包含窗口'A'中的一些信息('B')。然后有另一个堆栈面板来管理'B'中的内容,(折叠/可见)('C')。
“A”包含一个用于显示/折叠“B”的切换按钮。 “B”包含一个显示/折叠“C”的按钮。 “C”包含一个显示/折叠自身的按钮,“C”。
'C' 应该将其逻辑全部包含在一个视图中,因此 MainWindow ('A') 应该有一个简单的标记:
<StackPanel Style="{StaticResource FrameGradient}" Tag="{Binding ElementName=ToggleButton}">
<view:Content></view:Content>
</StackPanel>
目前,用于在“A”内切换按钮的绑定在样式中。在这种情况下,FrameGradient 具有如下触发器:
<Style x:Key="FrameGradient" TargetType="{x:Type StackPanel}">
//Setter properties
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="False">
<Setter Property="StackPanel.Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="StackPanel.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
是否可以在“内容”视图中切换不在视图中的面板“C”?我觉得我在这里错过了 XAML 的核心思想。我发现了一个“便宜”的解决方法,就是将内容视图中的“关闭”按钮放在标签之外,但这会导致样式问题,我觉得我不应该做这样愚蠢的事情。同样,这个想法是堆栈面板“C”的切换按钮包含在另一个视图中,我希望能够从另一个视图切换它。
如果我不够清楚,我深表歉意,如果需要,我会在此处向任何询问的人提供更多信息。
更新 我有一些时间来实际添加我正在使用的代码,这样可能更有意义。
MainWindow.xaml - 筛选器面板的逻辑(位于根目录中)
<StackPanel Grid.Row="1" Grid.Column="4" Visibility="Collapsed" Style="{StaticResource FrameGradient}">
<Grid x:Name="FilterContentGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<view:Filters></view:Filters>
</Grid>
</StackPanel>
Filters.xaml - 过滤器视图的逻辑(位于 /Views) 文件中需要折叠上述 StackPanel 的按钮。
<Button x:Name="FilterManagementCloseButton" Content="CLOSE"></Button>
Theme.Xaml - 所有样式的逻辑(与 MainWindow.xaml 和 App.xaml 一起位于根目录中) 按钮样式
<Style x:Key="FilterManagementCloseButton" TargetType="Button">
<Setter Property="Padding" Value="10,5,20,3" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource AncestorType={x:Type Local:MainWindow}}}" Value="True">
<Setter Property="StackPanel.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
最后,FrameGradient 样式也位于 Theme.xaml 中
<Style x:Key="FrameGradient" TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="False">
<Setter Property="StackPanel.Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="StackPanel.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
所以,我希望这能让事情更清楚。我希望 Filters.xaml 中的 CLOSE 按钮折叠位于 MainWindow 中的堆栈面板。我意识到这段代码现在一团糟。
【问题讨论】:
-
我假设创建一个实现 INPC 的
MainWindowViewModel类会有所帮助。将MainWindow的bool属性如IsBVisible andIsCVisible, maybe with logic in thegetters sounds applicable. Then, set theDataContext` 添加到MainWindowViewModel的实例中,您可以通过执行<StackPanel IsVisible="{Binding IsBVisible, Converter={StaticResource VisConverter}}" />之类的操作来绑定,假设您有'在我的特殊情况下,我有一个 MainWindowVM,但我也有一个 FiltersVM(我要显示的面板)。主窗口中的每个面板都有自己的虚拟机。
标签: wpf xaml mvvm mvvm-light