动态切换 WPF UI 控件
Switch WPF UI controls dynamically
我需要开发一个简单的 WPF 应用程序。在 UI window 中,左边是标签和文本块,右边是按钮。
Figure 1
根据配置设置(无论用户是惯用左手还是惯用右手),我需要切换控件,向左切换按钮,向右切换标签和文本块。
Figure 2
能否推荐一个解决此要求的好方法?
2 正如@RajN 所说,模板可能是正确且时尚的解决方案。
您还可以定义一个包含 2 列的网格,并相应地切换每个控件的 属性 'Grid.Column'
取决于应用程序可能的范围。
2 个备选方案:
1)
我认为随着应用程序的发展,可能不仅仅只有按钮。
我可能会构建一个用户控件,它封装标签和控件的这种行为。用户控件使用静态来决定文本块的位置,但看起来类似于行编辑控件:
https://gallery.technet.microsoft.com/WPF-Entity-Framework-MVVM-78cdc204
用户控件中有一个内容展示器,因此您可以放置任何您喜欢的控件(例如按钮)"in"它并为标签设置依赖项属性。
2)
定义 2 个与本文中使用的相似的内容控制模板:
https://social.technet.microsoft.com/wiki/contents/articles/28597.aspx
将它们放在单独的资源字典中并给它们相同的键。
合并到 application.current.resources 适当的资源字典和样式中。
鉴于这是一个应用程序设置,这大概是一个启动的东西。人们不只是动态地改变他们的"handedness"。所以你可以将它们用作静态资源。如果它们实际上要在 运行 时间更改,那么我认为这会涉及更多,因为您需要强制重新渲染视图。
也许不是最好的方法,但我按照您的建议使用网格设法实现了这一点。谢谢大家的宝贵意见。
我切换了列并相应地更改了宽度。
if (AppSettings.IsLeft)
{
parentGrid.ColumnDefinitions[0].Width = new GridLength(400, GridUnitType.Pixel);
parentGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
Grid.SetColumn(buttonGrid,0);
Grid.SetRow(buttonGrid,0);
Grid.SetColumn(contentGrid,1);
Grid.SetRow(contentGrid,0);
}
我需要开发一个简单的 WPF 应用程序。在 UI window 中,左边是标签和文本块,右边是按钮。
Figure 1
根据配置设置(无论用户是惯用左手还是惯用右手),我需要切换控件,向左切换按钮,向右切换标签和文本块。
Figure 2
能否推荐一个解决此要求的好方法?
2 正如@RajN 所说,模板可能是正确且时尚的解决方案。
您还可以定义一个包含 2 列的网格,并相应地切换每个控件的 属性 'Grid.Column'
取决于应用程序可能的范围。
2 个备选方案:
1)
我认为随着应用程序的发展,可能不仅仅只有按钮。
我可能会构建一个用户控件,它封装标签和控件的这种行为。用户控件使用静态来决定文本块的位置,但看起来类似于行编辑控件:
https://gallery.technet.microsoft.com/WPF-Entity-Framework-MVVM-78cdc204
用户控件中有一个内容展示器,因此您可以放置任何您喜欢的控件(例如按钮)"in"它并为标签设置依赖项属性。
2)
定义 2 个与本文中使用的相似的内容控制模板:
https://social.technet.microsoft.com/wiki/contents/articles/28597.aspx
将它们放在单独的资源字典中并给它们相同的键。
合并到 application.current.resources 适当的资源字典和样式中。
鉴于这是一个应用程序设置,这大概是一个启动的东西。人们不只是动态地改变他们的"handedness"。所以你可以将它们用作静态资源。如果它们实际上要在 运行 时间更改,那么我认为这会涉及更多,因为您需要强制重新渲染视图。
也许不是最好的方法,但我按照您的建议使用网格设法实现了这一点。谢谢大家的宝贵意见。
我切换了列并相应地更改了宽度。
if (AppSettings.IsLeft)
{
parentGrid.ColumnDefinitions[0].Width = new GridLength(400, GridUnitType.Pixel);
parentGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
Grid.SetColumn(buttonGrid,0);
Grid.SetRow(buttonGrid,0);
Grid.SetColumn(contentGrid,1);
Grid.SetRow(contentGrid,0);
}