.net - WPF 选项卡到窗口
问题描述
我正在构建一个 WPF (.Net 5) 应用程序。我正在使用标签。是否可以使用标签并将其“破坏”到自己的窗口中?我问是因为这将允许并排查看两个选项卡。
如果你们中的任何人有更好的方法来并排查看标签,我很想听听。
编码...
<TabControl Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"
ItemsSource="{ Binding DetailViewModels }"
SelectedItem="{Binding SelectedDetailViewModel, Mode=TwoWay}"
TabStripPlacement="Top">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" />
<TextBlock Text="*" Visibility="{Binding HasChanges, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Command="{Binding CloseCommand}" Style="{StaticResource closeButtonStyle}"
VerticalContentAlignment="Top" Content="x" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
我创建选项卡的方法是有一个命令,该命令创建一个 detailViewModel,它被添加到 DetailViewModels 可观察集合中。详细视图只是一个用户控件。
解决方案
如果您想将选项卡的内容带到新窗口,反之亦然,那么您可以尝试UserControl
使用您想要的内容创建一个新窗口,将其UserControl
放在窗口和选项卡内,然后创建一个ViewModel
用作他们俩的一个共享DataContext
。
不确定这是否是最好的方法。
更新
这是我使用您提供的示例代码的意思:
在您的 App.xaml 中:
<Application ...
xmlns:viewModels="clr-namespace:ViewModelsNamespace"
...>
<Application.Resources>
<DataTemplate DataType="{x:Type viewModels:DetailViewModel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" />
<TextBlock Text="*" Visibility="{Binding HasChanges, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Command="{Binding CloseCommand}" Style="{StaticResource closeButtonStyle}"
VerticalContentAlignment="Top" Content="x" />
</StackPanel>
</DataTemplate>
</Application.Resources>
</Application>
在您的主窗口中:
<Window ...>
<TabControl Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"
ItemsSource="{ Binding DetailViewModels }"
SelectedItem="{Binding SelectedDetailViewModel, Mode=TwoWay}"
TabStripPlacement="Top"/>
</Window>
在您的标签查看子窗口中:
<Window ...>
<ContentControl Content="{Binding SelectedDetailViewModel}" />
</Window>
这样,您就可以在应用程序中DataTemplate
定义DetailViewModel
资源,因此无论何时绑定它,都会使用 this 来查看它DataTemplate
。
因此,您需要做的就是将集合绑定DetailViewModels
到TabControl.ItemsSource
主窗口中的 并将 绑定SelectedDetailViewModel
到ContentControl
子窗口中的 ,它们都将查看相同的内容。
如果选项卡的内容变大了,您可以将它放在 a 中UserControl
并使用它来DataTemplate
代替,正如我之前建议的那样:
,UserControl
说“MyUserControl.xaml”:
<UserControl ...>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" />
<TextBlock Text="*" Visibility="{Binding HasChanges, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Command="{Binding CloseCommand}" Style="{StaticResource closeButtonStyle}"
VerticalContentAlignment="Top" Content="x" />
</StackPanel>
....
....
</UserControl>
在 App.xaml 中:
<Application ...
xmlns:viewModels="clr-namespace:ViewModelsNamespace"
...>
<Application.Resources>
<DataTemplate DataType="{x:Type viewModels:DetailViewModel}">
<local:MyUserControl/>
</DataTemplate>
</Application.Resources>
</Application>
推荐阅读
- java - 作为对 tomcat7 的战争部署的 Spring Boot 应用程序失败,并出现错误“找到了多个名为 [org_apache_tomcat_websocket] 的片段”
- oracle - 我的 Oracle RAW 返回参数有什么问题?
- powershell - 从 Windows10 任务栏中删除 OneDrive 图标的脚本
- c# - 用于在 Xamarin Forms 中的 AbsoluteLayout.LayoutBounds 中绑定 x 和 y 坐标的数据类型
- stm32 - 如何精确测量/了解 STM32L052K6T6 上的 ADC 参考电压?
- delphi - 在满足条件之前暂停程序执行的更好方法是什么?
- ruby-on-rails - 如何在 ActiveAdmin 中对自定义列进行排序?
- raspberry-pi - 是否可以使用 RPI 组合和控制多个 USB 摄像头
- python - 如何在使用 Python Selenium Webdriver (Firefox) 加载后防止页面更新
- python - 具有稀疏矩阵的numpy元素外积