2

我正在开发一个 WPF 应用程序,它将用于几种不同的 PC 类型。第一种更像是带有双高分辨率显示器的开发机器;第二个是大约800x600的手持触摸屏。

使用 MVVM 模式,我开发了一些不同的视图,它们根据选择的模式显示或多或少的信息。一般来说,布局可以很好地扩展。

我也有一些对话框,但目前这些对话框已针对高分辨率模式进行了优化。不幸的是,这些按钮在触摸屏上显得非常小,很难可靠地按下。

我想知道如何动态地重新设置对话框的样式。我想要一个应用程序设置来设置屏幕类型,从而控制样式。例如,如果屏幕是触摸屏,那么所有按钮和菜单都将具有更大的默认尺寸。

主题是要走的路吗?如果是这样,有人可以指点我一个好的教程吗?(不仅使用现有主题,还创建它们)

4

1 回答 1

4

为了改变风格,我做了以下事情:

  1. 为我想要的每种类型的主题创建一个样式表。
  2. 将整个项目中的所有样式引用设置为DynamicResource而不是“StaticResource”。
  3. 使用 ResourceDictionaries 的操作。

在此示例中,我有高、中和低质量的主题。我的样式表路径是:

  • /Assets/Styles/GlobalStylesLow.xaml
  • /Assets/Styles/GlobalStylesMed.xaml
  • /Assets/Styles/GlobalStylesHigh.xaml

操作代码如下:

/// <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 正确更新方面遇到问题,请从 UI 中获取。

于 2012-10-08T13:19:09.270 回答