【问题标题】:WPF ToolTip Style with dynamic LayoutTransform具有动态 LayoutTransform 的 WPF 工具提示样式
【发布时间】:2012-12-07 13:46:38
【问题描述】:

我有一个可以缩放 UI 的应用,我想用它来缩放工具提示。 我试过这样做:

<Style TargetType="{x:Type ToolTip}">
    <Setter Property="LayoutTransform" Value="{DynamicResource scaleTransf}"/>
    ...
</Style>

...scaleTransf 是我通过代码更改的资源:

Application.Current.Resources["scaleTransf"] = new ScaleTransform(...);

与:

<ScaleTransform x:Key="scaleTransf" ScaleX="1" ScaleY="1"/>

大多数工具提示的大小都会按比例缩放,但其中一些由 C# 代码创建的提示不会按比例缩放。我检查过,似乎我没有通过代码设置他们的 Style 或 LayoutTransform,所以我真的不明白出了什么问题......此外,我的印象是上面的 XAML 代码运行了几天前。 :(

我可以做些什么来让它一直工作而不在代码隐藏中设置 LayoutTransform 吗?

编辑:不改变比例的工具提示是以前可见的。

EDIT1:如果我在代码后面使用SetResourceReference() 将每个ToolTip 实例的LayoutTransform 设置为scaleTransf,一切正常。我不明白为什么样式不起作用,而它应该对创建的每个 ToolTip 执行完全相同的操作...基于我对 WPF 的有限了解,我将其称为 BUG!


EDIT2:

我也试过这个:

Application.Current.Resources.Remove("scaleTransf");
Application.Current.Resources.Add("scaleTransf", new ScaleTransform(val, val));

EDIT3:我尝试使用 DependencyProperty 解决这个问题:

在 MainWindow.xaml.cs 中:

    public static readonly DependencyProperty TransformToApplyProperty = DependencyProperty.Register("TransformToApply", typeof(Transform), typeof(MainWindow));
    public Transform TransformToApply
    {
        get { return (Transform)this.GetValue(TransformToApplyProperty); }
    }

在 MainWindow 的某处,响应用户输入:

this.SetValue(TransformToApplyProperty, new ScaleTransform(val, val));

XAML 样式:

<Style TargetType="{x:Type ToolTip}">
    <Setter Property="LayoutTransform" Value="{Binding TransformToApply, Source={x:Reference WndXName}}"/>
...

使用此代码,似乎没有一个工具提示可以相应地缩放。

【问题讨论】:

  • 改用Application.Current.Resources.Add(xxx)
  • 我刚刚尝试删除并重新添加资源,结果是一样的。
  • 删除和重新添加是什么意思?这是动态的吗?发布 XAML 和代码。
  • 我的意思见 EDIT2。
  • 你不需要那个。所有 WPF 类都映射到默认的 xml 命名空间。

标签: wpf dynamic styles layouttransform


【解决方案1】:

我不认为资源是适合您情况的最佳方法。

在这种情况下,最好将 Transform 声明为窗口的 DependencyProperty:

public static readonly DependencyProperty TransformToApplyProperty = DependencyProperty.Register("TransformToApply", typeof(Transform), typeof(Window));

然后在 XAML 中:

<Window  .... (all the xmlns)
         x:Name="window"/>
    <AnyControl ScaleTransform="{Binding TransformToApply, ElementName=window}"/>
</Window>

【讨论】:

  • 我刚刚尝试过这个,但不同的是我已经在样式中设置了变换。为每个控件设置它并不是一件容易的事(我认为我的第一个解决方案也可以这样工作)。假设我没有做错任何事,那是行不通的。请参阅上面的 EDIT3。
  • 试试{Binding TransformToApply, Source={x:Reference window}}
  • 这给了我一个例外:Unresolved reference 'MainWindow'. 我尝试为 MainWindow 添加命名空间,但仍然找不到!
  • {x:Reference} 应该指向窗口的 x:Name,而不是它的类,你是这样做的吗?
  • 没有。我现在已经纠正了它,但它再次不起作用。它仍然找不到给定的 x:Name。注意:我的样式在一个单独的 XAML 文件中,而不是在 MainWindow.xaml 中(我不知道这是否重要以及如何在不移动它的情况下更正它。同样,我尝试使用命名空间但没有运气)。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多