【问题标题】:accessing a visual element in code访问代码中的可视元素
【发布时间】:2010-08-05 03:59:33
【问题描述】:

我想在代码中执行以下 xaml 的等效操作,但我不知道如何获取该文本块元素:

<local:DayOfTheWeekColumn 
    ...
    <local:DayOfTheWeekColumn.Header>
        <TextBlock 
            Text="{Binding ...}, 
            ToolTip="{Binding ...} />                                  
    </local:DayOfTheWeekColumn.Header>
</local:DayOfTheWeekColumn>

DayOfTheWeekColumn 是 DataGridTextColumn 的子类。我可以很容易地获得 Header 并设置它的内容,现在我想在代码中设置 ToolTip,想办法做到这一点就是我在上面的 xaml 中的做法。

干杯,
浆果

编辑 =========

到目前为止,这是 DayOfTheWeekColumn 的代码。 xaml 中的 TextBlock 是 Header 的可视化树的一部分,而不是我想保留在 xaml 中的东西。我确实想在代码中访问它的工具提示,所以我可以在那里设置它。

我认为应该在列 Header 上有一个 Children 属性,我可以访问它来查找 TextBlock,但还没有找到。

public class DayOfTheWeekColumn : DataGridTextColumn
{
    public static readonly DependencyProperty DowDateProperty = DependencyProperty.RegisterAttached(
        "DowDate", typeof (DateTime), typeof (DayOfTheWeekColumn), new PropertyMetadata(OnDateChanged));

    public DateTime DowDate
    {
        get { return (DateTime)GetValue(DowDateProperty); }
        set { SetValue(DowDateProperty, value); }
    }

    private static void OnDateChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) {
        var col = (DataGridTextColumn) target;
        var date = (DateTime) e.NewValue;

        col.Header = date.ToString(Strings.ShortDayOfWeekFormat);
        //col.Header.ToolTip = "If Only It Were so Easy!!" <==============
    }

    public DayOfTheWeekColumn() {
        Width = 60;
        CanUserReorder = false;
        CanUserResize = false;
        CanUserSort = false;
    }
}

【问题讨论】:

    标签: wpf silverlight xaml


    【解决方案1】:

    Chris Andersen 的 Essential Windows Presentation Foundation 的 p161 几乎回答了这个问题。如果你有的话,我推荐它作为参考。

    然而,你是如此接近我不知道你是怎么错过的:)

    private static void OnDateChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) {
        var col = (DataGridTextColumn) target;
        var date = (DateTime) e.NewValue;
    
        var textblock = new TextBlock();
        col.Header = textblock;
        textblock.Text = date.ToString(Strings.ShortDayOfWeekFormat);
        textblock.ToolTip = "It is that easy. :)";
    }
    

    【讨论】:

    • Suh-weet 我有麦当劳的 WPF 书,我不喜欢它,还有 Nathan 的 WPF Unleashed,它的可读性更高,但在某些方面很轻。我从未听说过安德森的书,但会去看看。谢谢!
    【解决方案2】:

    为您的 TextBlock 指定一个带有 x:Name 属性的名称,您应该能够通过该名称在代码中访问它。

    <TextBlock x:Name="textBlock1" />
    

    【讨论】:

    • 但是它被一个叫做 Column 的东西包围着,所以我认为它也在一个 Row (ItemSource) 上。
    • 感谢您的回复,但请参阅编辑。如果可以的话,我想让 TextBlock 的 XAML 版本消失,并在代码中处理它。干杯
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多