我正在开发一个WPF应用程序,它将用于几种不同的PC类型。第一种类型是带有双高分辨率监视器的开发机器;第二个是手持式触摸屏,大约800x600。
使用MVVM模式,我开发了一些不同的视图,根据所选模式显示或多或少的信息。一般来说,布局可以很好地扩展。
我也有一些对话框,但目前这些都是针对高分辨率模式进行了优化的。不幸的是,触摸屏上的按钮看起来非常小,难以可靠地击中。
我想知道如何动态重新设置对话框。我想有一个应用程序设置,它设置屏幕类型,从而控制样式。因此,例如,如果屏幕是触摸屏,则所有按钮和菜单都将具有更大的默认大小。
主题是可行的吗?如果是这样,有人能指点我一个好的教程吗? (不只是使用现有主题,还要创建它们)
答案 0 :(得分:4)
为了改变风格,我会做以下事情:
在这个例子中,我有高,中,低质量的主题。我的样式表路径是:
操作代码的工作原理如下:
/// <summary>
/// Level of graphics quality enum.
/// </summary>
public enum GraphicsQuality
{
/// <summary>
/// Low
/// </summary>
Low = 0,
/// <summary>
/// Medium
/// </summary>
Medium = 1,
/// <summary>
/// High
/// </summary>
High = 2
}
/// <summary>
/// Sets the Application Resource Dictionaries based on selection.
/// </summary>
/// <param name="quality">The quality.</param>
/// <param name="onRedraw">The on redraw.</param>
public static void UpdateStyles(
Enums.GraphicsQuality quality = Enums.GraphicsQuality.High, Action onRedraw = null)
{
// Reset resource dictionaries
Application.Current.Resources.MergedDictionaries.Clear();
// Base style path
const string basePath = "/<project_base>;component/Assets/Styles";
// Evaluate global quality
switch (quality)
{
case Enums.GraphicsQuality.High:
LoadStyle(basePath + "/GlobalStylesHigh.xaml");
break;
case Enums.GraphicsQuality.Medium:
LoadStyle(basePath + "/GlobalStylesMed.xaml");
break;
case Enums.GraphicsQuality.Low:
LoadStyle(basePath + "/GlobalStylesLow.xaml");
break;
}
// Redraw
if (onRedraw != null)
{
onRedraw();
}
}
/// <summary>
/// Loads a specific style by Uri.
/// </summary>
/// <param name="stylePath">The style path.</param>
private static void LoadStyle(string stylePath)
{
var dic = new ResourceDictionary
{
Source = new Uri(stylePath, UriKind.Relative)
};
Application.Current.Resources.MergedDictionaries.Add(dic);
}
如果存在更改样式表的条件,请调用 UpdateStyles 。
注意:强> onRedraw 参数只是更新样式后要执行的最终操作。在某些情况下,您可能想要传递
this.InvalidateVisual
如果您在UI正确更新时遇到问题,请从用户界面。