【问题标题】:Bind RenderTransform elements to code-behind variables将 RenderTransform 元素绑定到代码隐藏变量
【发布时间】:2010-11-22 07:11:31
【问题描述】:

我正在关注此线程中给出的答案:Access codebehind variable in XAML

这是我想要做的:

<Rectangle Name="MyRect" Fill="AliceBlue" MouseDown="Rectangle_MouseDown">
    <Rectangle.RenderTransform>
        <TransformGroup>
            <RotateTransform Angle="0" CenterX="300" CenterY="150"/>
            <TranslateTransform X="{DynamicResource TransX}" Y="0"/>
        </TransformGroup>
    </Rectangle.RenderTransform>
</Rectangle>

然后,我的代码中有一个变量,它后面会发生变化。它被称为 TransX,我将其添加为资源:

public double TransX = 0;

public SvgPreview()
{
    InitializeComponent();
    SvgPreview1.Resources.Add("TransX", TransX);
}

矩形确实从一开始就得到了正确的变换,但是变换不会重新渲染以反映 TransX 变量的变化。我该怎么办?

另外,我必须为其他几个值做同样的事情。

【问题讨论】:

    标签: c# wpf xaml transform


    【解决方案1】:

    我认为您应该让 SvgPreview 实现 INotifyPropertyChanged,将其设置为 Rectangle 的某个父级的 DataContext,并将 TransX 更改为属性并通过 DataBinding 访问它。

    编辑:像这样:

    <Rectangle Name="MyRect" Fill="AliceBlue" MouseDown="Rectangle_MouseDown"> 
        <Rectangle.RenderTransform> 
            <TransformGroup> 
                <RotateTransform Angle="0" CenterX="300" CenterY="150"/> 
                <TranslateTransform X="{Binding TransX}" Y="0"/> 
            </TransformGroup> 
        </Rectangle.RenderTransform> 
    </Rectangle> 
    
    
    class SvgPreview : INotifyPropertyChanged
    // ......
    private double transX;
    public double TransX
    {
        get { return transX; }
        set 
        {
            if(transX != value)
            {
                transX = value;
                OnNotifyPropertyChanged("TransX"); 
            } 
        }
    }                
    
    public SvgPreview() 
    { 
        InitializeComponent(); 
        TransX = 0;
    }
    

    在包含您的 Rectangle 的 Windows/Page/Control 的 CodeBehehind 中;

    // ...
    InitializeCompenent();
    this.DataContext = new SvgPreview();
    // ...
    

    【讨论】:

    • 我很困惑。我没有任何名为“OnNotifyPropertyChanged”的方法
    • @Adam:对不起,看起来像这样:public void OnPropertyChanged(String propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    • @Adam S:实现 INotifyPropertyChanged 接口
    • 抱歉各位,我相信你们的解决方案是正确的,但我很新,我不知道“实现 INotifyPropertyChanged 接口”是什么意思
    • 在您的 SvgPreview 类中,将其声明为 class SvgPreview : INotiyPropertyChanged。执行此操作后,Visual Studio 将在字符串 INotifyPropertyChanged 上提供快速工具提示。单击它将提供选项“实现接口 INotifyPropertyChanged”。接受该选项,在我上面的评论中添加该方法,并且您已经实现了它。此外,您可以尝试在 Google 上搜索“DataBinding WPF”以了解我们正在谈论的内容 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2011-04-09
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多