【问题标题】:Access element from style WPF从样式 WPF 访问元素
【发布时间】:2017-05-04 08:29:55
【问题描述】:

我有一个像这样在 ResourceDictionary 中声明的样式。

<Style x:Key="MapMarkerLabelStyle" TargetType="{x:Type TextBlock}">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <TranslateTransform X="{Binding ActualWidth,                                              
                 Converter={StaticResource DoubleMultiplierConverter}, 
                                            ConverterParameter=-0.5}" 
                                Y="-62"></TranslateTransform>
        </Setter.Value>
    </Setter>
</Style>

还有文本块

<TextBlock Style="{StaticResource MapMarkerLabelStyle}" />

还有转换器:

public class DoubleMultiplierConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var originalValue = (double) value;
        var format = new NumberFormatInfo {NumberDecimalSeparator = "."};
        var multiplier = System.Convert.ToDouble(parameter, format);
        return originalValue * multiplier;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在翻译转换中,我需要访问 textblock ActualWidth 属性,但无法弄清楚绑定的外观。

【问题讨论】:

  • 显然您正试图将 TextBlock 置于给定位置的中心。将 Horizo​​ntalAlignment 设置为 Center 不起作用吗?
  • 将 TranslateTransform 设置为 TextBlock 居中可能不是最好的方法。将 TextBlock 居中放置在一个固定大小的居中 Panel 中,让 WPF 布局来完成这项工作怎么样?

标签: c# wpf


【解决方案1】:

绑定缺少适当的源对象。要绑定到 TextBlock 的 ActualWidth 属性,您应该像这样设置 RelativeSource

<Style x:Key="MapMarkerLabelStyle" TargetType="TextBlock">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <TranslateTransform
                X="{Binding Path=ActualWidth,
                            RelativeSource={RelativeSource AncestorType=TextBlock}
                            Converter={StaticResource DoubleMultiplierConverter}, 
                            ConverterParameter=-0.5}" 
                Y="-62"/>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

  • 使用 AncestorType=TextBlock 我收到此错误消息:System.Windows.Data 错误:4:无法找到与引用'RelativeSource FindAncestor,AncestorType='System.Windows.Controls.TextBlock'的绑定源,祖先级别='1''。绑定表达式:路径=实际宽度;数据项=空;目标元素是“TranslateTransform”(HashCode=62126894);目标属性是“X”(类型“双”)
  • 好吧,这对我有用,虽然没有你的转换器。您是否以实际针对 TextBlock 的样式执行此操作?
  • 我在原始帖子中添加了我的转换器。我的样式代码有 targettype=TextBlock
  • 我试图从绑定中删除转换器,但我仍然得到同样的错误
  • 您在 VS 输出窗口中收到该错误消息一次,但随后绑定工作...只需忽略该错误消息。
【解决方案2】:

试试这个。

 <TranslateTransform X="{Binding RelativeSource={RelativeSource Self}, 
                          Path=ActualWidth,                                              
             Converter={StaticResource DoubleMultiplierConverter}, 
             ConverterParameter=-0.5}" 
                     Y="-62">
 </TranslateTransform>

【讨论】:

  • 然后我得到以下 System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“TranslateTransform”(HashCode=48937974)上找不到“ActualWidth”属性。绑定表达式:路径=实际宽度; DataItem='TranslateTransform' (HashCode=48937974);目标元素是“TranslateTransform”(HashCode=48937974);目标属性是“X”(类型“双”)
  • 我试过这个。装订看起来不错。似乎问题出在转换器中。如果你分享它的代码会很好。
  • Self 表示 TranslateTransform,而不是 TextBlock。应该是RelativeSource={RelativeSource AncestorType=TextBlock}
  • 不,它仅表示 TextBlock,因为样式的 TargetType 是 TextBlock 本身。运行这段代码并检查它
  • @Parag 你错了。而且你没有“尝试这个”。如果你真的尝试过,你会发现它不起作用。 RelativeSource Self 始终表示应用绑定的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
相关资源
最近更新 更多