WPF问题一则

Luskyle 2018-02-23 04:45:56
我定义了一个 usercontrol,代码如下


<Button x:Class="UserButtonTest.MyUserButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:UserButtonTest"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Background="Transparent" BorderThickness="0">

<Button.Template>
<ControlTemplate>
<Grid>
<Border Name="border" BorderThickness="3" CornerRadius ="5" Background="#FFFFCC" BorderBrush="#FF6633">
<Border BorderThickness="0" Height="20">
<Viewbox VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Name="tb" Text="DefaultText"></TextBlock>
</Viewbox>
</Border>
</Border>
</Grid>
</ControlTemplate>
</Button.Template>

</Button>


之后又给这个控件添加了一个Text属性

#region Text属性
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MyUserButton),new PropertyMetadata("TextBox",new PropertyChangedCallback(OnTextChanged)));

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

static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs args)
{
((MyUserButton)sender).tb.Text = (string)args.NewValue; // tb 在这里
}
#endregion



运行时提示我 找不到文本框 tb ,为啥就找不到呢?应该咋做?
...全文
709 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_秦同学_ 2018-02-26
  • 打赏
  • 举报
回复
引用 6 楼 qq_33712555 的回复:
[quote=引用 5 楼 Aigle_Qin 的回复:] 方法一,修改OnTextChanged中的代码:

MyUserButton self = sender as MyUserButton;
TextBlock tb = self.GetTemplateChild("tb") as TextBlock;
tb.Text = (string)args.NewValue;
方法二,使用WPF绑定特性,绑定到依赖属性上,修改xaml代码: <TextBlock Name="tb" Text="{Binding Text,RelativeSource={RelativeSource TemplateParent}}"/>
亲测方法二有效,方法一仍提示未应用到指定元素啥的错误[/quote] 单纯从你贴出来的问题代码来看的话应该是可以的,你多尝试一下看看。具体的补充一下WPF里面逻辑树、视觉树的知识。
Luskyle 2018-02-26
  • 打赏
  • 举报
回复
引用 5 楼 Aigle_Qin 的回复:
方法一,修改OnTextChanged中的代码:

MyUserButton self = sender as MyUserButton;
TextBlock tb = self.GetTemplateChild("tb") as TextBlock;
tb.Text = (string)args.NewValue;
方法二,使用WPF绑定特性,绑定到依赖属性上,修改xaml代码: <TextBlock Name="tb" Text="{Binding Text,RelativeSource={RelativeSource TemplateParent}}"/>
亲测方法二有效,方法一仍提示未应用到指定元素啥的错误
_秦同学_ 2018-02-24
  • 打赏
  • 举报
回复
方法一,修改OnTextChanged中的代码:

MyUserButton self = sender as MyUserButton;
TextBlock tb = self.GetTemplateChild("tb") as TextBlock;
tb.Text = (string)args.NewValue;
方法二,使用WPF绑定特性,绑定到依赖属性上,修改xaml代码: <TextBlock Name="tb" Text="{Binding Text,RelativeSource={RelativeSource TemplateParent}}"/>
Luskyle 2018-02-23
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
不需要手动获取,已经定义了依赖项属性,就使用绑定形式把Text绑定到tb的Text上即可。 具体 msdn wpf DataContext/Binding/RelativeSource/Ancestor的用法。
什么意思?能说的更名白点吗
exception92 2018-02-23
  • 打赏
  • 举报
回复
不需要手动获取,已经定义了依赖项属性,就使用绑定形式把Text绑定到tb的Text上即可。 具体 msdn wpf DataContext/Binding/RelativeSource/Ancestor的用法。
Luskyle 2018-02-23
  • 打赏
  • 举报
回复
引用 1 楼 mlqxj35674 的回复:
按照元素树,tb不是button的直接子元素或属性,要一步步获取吧
Grid写在模板外就可以直接获得。写在模板内就不可以。为啥,应该咋获取?
mlqxj35674 2018-02-23
  • 打赏
  • 举报
回复
按照元素树,tb不是button的直接子元素或属性,要一步步获取吧

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧