如何在使用较低分辨率的屏幕时重新设置WPF应用程序的样式

时间:2012-10-08 08:27:58

标签: wpf themes

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

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

我也有一些对话框,但目前这些都是针对高分辨率模式进行了优化的。不幸的是,触摸屏上的按钮看起来非常小,难以可靠地击中。

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

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

1 个答案:

答案 0 :(得分:4)

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

  1. 为我想要的每种主题创建一个样式表。
  2. 将项目中的所有样式引用设置为 DynamicResource ,而不是“StaticResource”。
  3. 使用ResourceDictionaries的操作。
  4. 在这个例子中,我有高,中,低质量的主题。我的样式表路径是:

    • /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正确更新时遇到问题,请从用户界面