具有响应式设计的WPF应用

时间:2015-12-07 19:54:33

标签: c# wpf responsive-design

我想创建一个WPF应用程序,它的控件位置取决于窗口的大小。

如果MainWindow的宽度超过上限,让我们说500,那么我希望我的Grid为2x2,如果它低于500,那么4x1(4行,1列)。

首先,我制作了2个网格,一个2x2,另一个4x1。我有4个不同的UserControls,它们代表MVVM的View部分。我以为我将VisualStateManager与1组一起使用,该组有2个状态,一个用于defaultGrid,另一个用于narrowGrid。第一个状态将第一个网格的可见性设置为可见,第二个网格设置为折叠,另一个状态反转(我甚至需要它们两者都这样做?)。我将GoToElementState放在SizeChanged事件的处理程序中。我在一本书中看到了这一点,但他们没有使用UserControls,而是将所有控件从第一个Grid复制到第二个Grid并更改了每个控件的Row和Column属性。我认为2个不同的网格共享1个UserControl是可能的(这实际上是我首先在这4个UserControl中放置了十几个控件/元素的唯一原因),但到目前为止我还是#39 ;我发现那是不可能的(虽然我在这里可能是错的)。

现在,对于某些控件,我想我不会介意我技术上每个UserControl有2个实例,因为绑定使它们同步,但是如果我在TextBox中键入内容并更改窗口大小/视觉状态然后在"同样的#34; TextBox我有不同的文字。

我得出的结论是,我根本不需要VSM,除了根网格之外我不需要任何其他网格。在SizeChanged的处理程序中,我使rootGrid为2x2或4x1,具体取决于窗口宽度。在MainWindow.xaml.cs中,我还制作了这4个UserControls私有字段并实例化它们。他们正在根据窗口宽度更改其Row和Column属性。通过这样做,我现在总是只有那4个UserControl实例,只是改变他们在应用程序中的位置。 (我不需要任何这些UserControl的多个实例)。

我想知道的是:有没有更好/更优雅/可能的传统方式,我还没找到?

我有想法只做2个UserControls(2个视图)并使用VSM来表示它们。两个视图都将绑定到ViewModel的相同属性。 "同步"例如,对于TextBox,可以通过将第一个View的TextBox的Text属性绑定到第二个View的TextBox的Text属性来完成TextBox中的插入文本或ComboBox的选定项目。但这似乎不是一个更好的选择。

我也想过为UserControls的行和列绑定制作自定义转换器,但这看起来更糟。

顺便说一下。我使用的是C#,VS 2013和Windows 7.我知道UWP在VSM中有很多有趣的东西,但是我还没有切换到UWP,我刚刚开始玩WPF一个月前。

此外,我无法使用WrapPanel,因为我需要精确的2x2或4x1网格中的这些控件。我无法使用UniformGrid,因为我需要按特定顺序使用它们。

对此的任何意见都将不胜感激。

0 个答案:

没有答案