如何在ViewModel中获取控件的高度

时间:2017-03-10 05:54:38

标签: c# xaml mvvm uwp winrt-xaml

我的Xaml中有一个ContentControl,我想在ViewModel中访问它的高度,我尝试在ViewModel中创建一个属性,并通过TwoWay将其绑定到ContentControl。但问题是它将ContentControl高度设置为0,这是该属性的默认值。

代码:

的Xaml

<ContentControl x:Name="ContentControl"
                Content="{Binding ContentFrame}"
                HorizontalContentAlignment="Stretch"
                Height="{Binding ContentControlHeight, Mode=TwoWay}"
                VerticalContentAlignment="Stretch"></ContentControl>

ViewModel(使用Fody进行属性更改通知):

public double ContentControlHeight {get;组; }

2 个答案:

答案 0 :(得分:2)

根据Romasz的建议,@ ZeaShah你可以创建一个自定义类并在其中注册SizeChanged事件。

((sum1) 5)

定义依赖项属性并将其绑定在主页面中:

public class MyContentControl : ContentControl
{
    public MyContentControl()
    {
        this.SizeChanged += MyContentControl_SizeChanged;
    }

    private void MyContentControl_SizeChanged(object sender, Windows.UI.Xaml.SizeChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("SizeChanged: height " + e.NewSize.Height + " width: " + e.NewSize.Width);
        CHeight = e.NewSize.Height;
    }

    public double CHeight
    {
        get { return (double)GetValue(CHeightProperty); }
        set { SetValue(CHeightProperty, value); }
    }

    // Using a DependencyProperty as the backing store for CHeight.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty CHeightProperty =
        DependencyProperty.Register("CHeight", typeof(double), typeof(MyContentControl), new PropertyMetadata(0));
}

答案 1 :(得分:0)

绑定到ActualHeight(可能宽度)不是一个好选择,因为:

  

出于ElementName绑定的目的,ActualHeight 在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualHeight作为ElementName绑定的绑定源。如果您的方案需要基于ActualHeight的更新,请使用SizeChanged处理程序。

值得遵循上述内容并使用SizeChanged事件。