如何动态获取customcontrol的ActualWidth和ActualHeight?

时间:2014-12-18 06:34:38

标签: wpf xaml custom-controls

我有一个自定义控件,ccTextBlock放在ScrollViewer中。当通过绑定向其发送不同的字符串时,customcontrol将改变大小(垂直)。自定义控件将保留在显示屏上,但会在屏幕上其他位置选择文本时更改。

如何在之后获取自定义控件的实际宽度和高度,并将每个文本字符串发送给它? (使用OnApplyTemplate()不起作用,因为它似乎只在自定义控件的第一次构造时被调用一次。)

感谢您的回复。

<ScrollViewer VerticalScrollBarVisibility="Auto">
    <Grid>
        <wc:ccTextBlock Text="{Binding Text, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
    </Grid>
</ScrollViewer>

更新 :也许更好的方法来表达这个问题&#34;如何在ScrollViewer内部获取元素的高度& #34;。以下是ccTextBlock的定义:

     public class ccTextBlock : Control
{

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(ccTextBlock), new UIPropertyMetadata(null));

    /// <summary>
    /// Constructor
    /// </summary>
    static ccTextBlock()
    {
        // Initialize as lookless control
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ccTextBlock), new FrameworkPropertyMetadata(typeof(ccTextBlock)));
    }

    public override void OnApplyTemplate()
    {
        //Effectively apply the template
        base.OnApplyTemplate();

        Console.WriteLine(String.Format(" ActualHeight is {0}", this.ActualHeight.ToString()));
        var x = this.FontSize;
    }
}

Generic.xaml在哪里:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfCustomControlLibrary">

<Style TargetType="{x:Type local:ccTextBlock}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ccTextBlock}">
                <!-- Control Layout -->
                    <TextBlock Text="{TemplateBinding Text}" TextWrapping="Wrap" />                  
            </ControlTemplate>
          </Setter.Value>
        </Setter>
</Style>

1 个答案:

答案 0 :(得分:3)

ActualWidthActualHeight是包含控件的当前widthheight的属性。

如果您正在寻找通知有关更改的事件,那么它将是FrameworkElement.SizeChanged事件。您可以在OnApplyTemplate实施中注册此活动。