Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取动画属性ChangedCallback中的窗口实际宽度时出错_C#_Wpf_Custom Controls_Dependency Properties_Propertychanged - Fatal编程技术网

C# 获取动画属性ChangedCallback中的窗口实际宽度时出错

C# 获取动画属性ChangedCallback中的窗口实际宽度时出错,c#,wpf,custom-controls,dependency-properties,propertychanged,C#,Wpf,Custom Controls,Dependency Properties,Propertychanged,我想创建DoubleAnimation的“自定义到依赖项”属性。它会将To属性设置为容器窗口的当前宽度减去该值。 其用途如下: <local:SpecialDoubleAnimation Storyboard.TargetProperty="Width" From="0" SpecialTo="50" Duration="0:0:3"></local:SpecialDoubleAnimation> 如您所见,OnChangeCallback事件调用非静态方法DoChan

我想创建DoubleAnimation的“自定义到依赖项”属性。它会将To属性设置为容器窗口的当前宽度减去该值。 其用途如下:

<local:SpecialDoubleAnimation Storyboard.TargetProperty="Width" From="0" SpecialTo="50" Duration="0:0:3"></local:SpecialDoubleAnimation>
如您所见,OnChangeCallback事件调用非静态方法DoChangeCallback,以更改DoubleAnimation的to属性,通过调用window.GetWindowobj.ActualWidth获取当前窗口宽度

但是该代码在XAML代码的SpecialTo=50处抛出一个错误,错误是

对象引用未设置为对象的实例

我认为这是因为调用Window.GetWindowobj.ActualWidth,因为如果我删除它,错误就会消失

我该如何实现这一点?是否有其他方法可以获取PropertyChangeCallback上的实际窗口大小


谢谢。

是否尝试添加类似ifWindow.GetWindowobj的内容=空…?谢谢@Bizz,但尽管错误已经消失,它似乎总是空的,你知道为什么吗?有没有办法让它工作?另一种解决方案:使用标准的DoubleAnimation并将其“到”属性绑定到窗口的实际宽度。使用减去偏移值的绑定转换器。转换器可能会将偏移量作为参数。请阅读本文:我怀疑动画是否添加到任何逻辑树中。这也是GetWindow总是返回null的原因。
public class SpecialDoubleAnimation : DoubleAnimation
{

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(SpecialDoubleAnimation),new FrameworkPropertyMetadata(OnChangeCallback));

    public double SpecialTo
    {
        get
        {
            return (double)GetValue(SpecialToProperty);
        }
        set
        {
            SetValue(SpecialToProperty, value);
        }
    }

    private static void OnChangeCallback(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        ((SpecialDoubleAnimation)obj).DoChangeCallback(Window.GetWindow(obj).ActualWidth, (double)args.NewValue);
    }

    private void DoChangeCallback(double windowWidth, double value)
    {
        To = windowWidth - value;
    }
}