C# 将新的 Textblock 对象绑定到 XAML 文件中的 Textblock 控件
C# bin new Textblock object to Textblock control in XAML file
我想在我的 C#-WPF 应用程序中显示包含链接的文本。文本是静态的,在编译期间是已知的。
直接在 XAML 文件上工作时,以下是我想要的:
<TextBlock Name="TextBlockWithHyperlink">
Some text
<Hyperlink
NavigateUri="http://somesite.com"
RequestNavigate="Hyperlink_RequestNavigate">
some site
</Hyperlink>
some more text
</TextBlock>
自从使用 MVVM 以来,我想通过依赖项 属性 将 Textblock 绑定到新构造的 Textblock 对象。 XAML 看起来像这样:
<StackPanel Grid.Row="1" Margin="5 0 0 0">
<TextBlock Height="16" FontWeight="Bold" Text="Generic Text with link"/>
<TextBlock Text="{Binding Path=TextWithLink, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
在我的 ViewModel 中我放置了
private void someMethod(){
...
TextWithLink = CreateText();
...
}
private TextBlock(){
TextBlock tb = new TextBlock();
Run run1 = new Run("Text preceeding the hyperlink.");
Run run2 = new Run("Text following the hyperlink.");
Run run3 = new Run("Link Text.");
Hyperlink hyperl = new Hyperlink(run3);
hyperl.NavigateUri = new Uri("http://search.msn.com");
tb.Inlines.Add(run1);
tb.Inlines.Add(hyperl);
tb.Inlines.Add(run2);
return tb;
}
private TextBlock _textWithLink;
public TextBlock TextWithLink {
get => _textWithLink;
set{
_textWithLink = value;
OnPropertyChanged();
}
}
依赖性 属性 设置正在运行我看到一个新的 TextBlock 被分配给 XAML 控件,但是没有显示内容,只显示文本
System.Windows.Controls.TextBlock
而不是内容。我无法理解为显示所需的混合文本而必须更改的内容。很高兴得到帮助。
不应在视图模型中使用 TextBlock 实例,而应使用 Inline
元素的集合以及接受它作为绑定源的 UI 元素。
由于 TextBlock 的内联 属性 不可绑定,您可以创建一个带有可绑定 属性 的 deribed TextBlock,如下所示:
public class MyTextBlock : TextBlock
{
public static readonly DependencyProperty BindableInlinesProperty =
DependencyProperty.Register(
nameof(BindableInlines),
typeof(IEnumerable<Inline>),
typeof(MyTextBlock),
new PropertyMetadata(null, BindableInlinesPropertyChanged));
public IEnumerable<Inline> BindableInlines
{
get { return (IEnumerable<Inline>)GetValue(BindableInlinesProperty); }
set { SetValue(BindingGroupProperty, value); }
}
private static void BindableInlinesPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var textblock = (MyTextBlock)o;
var inlines = (IEnumerable<Inline>)e.NewValue;
textblock.Inlines.Clear();
if (inlines != null)
{
textblock.Inlines.AddRange(inlines);
}
}
}
现在你可以像这样使用它
<local:MyTextBlock BindableInlines="{Binding SomeInlines}"/>
像这样的视图模型属性:
public IEnumerable<Inline> SomeInlines { get; set; }
...
var link = new Hyperlink(new Run("Search"));
link.NavigateUri = new Uri("http://search.msn.com");
link.RequestNavigate += (s, e) => Process.Start(e.Uri.ToString());
SomeInlines = new List<Inline>
{
new Run("Some text "),
link,
new Run(" and more text")
};
我想在我的 C#-WPF 应用程序中显示包含链接的文本。文本是静态的,在编译期间是已知的。
直接在 XAML 文件上工作时,以下是我想要的:
<TextBlock Name="TextBlockWithHyperlink">
Some text
<Hyperlink
NavigateUri="http://somesite.com"
RequestNavigate="Hyperlink_RequestNavigate">
some site
</Hyperlink>
some more text
</TextBlock>
自从使用 MVVM 以来,我想通过依赖项 属性 将 Textblock 绑定到新构造的 Textblock 对象。 XAML 看起来像这样:
<StackPanel Grid.Row="1" Margin="5 0 0 0">
<TextBlock Height="16" FontWeight="Bold" Text="Generic Text with link"/>
<TextBlock Text="{Binding Path=TextWithLink, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
在我的 ViewModel 中我放置了
private void someMethod(){
...
TextWithLink = CreateText();
...
}
private TextBlock(){
TextBlock tb = new TextBlock();
Run run1 = new Run("Text preceeding the hyperlink.");
Run run2 = new Run("Text following the hyperlink.");
Run run3 = new Run("Link Text.");
Hyperlink hyperl = new Hyperlink(run3);
hyperl.NavigateUri = new Uri("http://search.msn.com");
tb.Inlines.Add(run1);
tb.Inlines.Add(hyperl);
tb.Inlines.Add(run2);
return tb;
}
private TextBlock _textWithLink;
public TextBlock TextWithLink {
get => _textWithLink;
set{
_textWithLink = value;
OnPropertyChanged();
}
}
依赖性 属性 设置正在运行我看到一个新的 TextBlock 被分配给 XAML 控件,但是没有显示内容,只显示文本
System.Windows.Controls.TextBlock
而不是内容。我无法理解为显示所需的混合文本而必须更改的内容。很高兴得到帮助。
不应在视图模型中使用 TextBlock 实例,而应使用 Inline
元素的集合以及接受它作为绑定源的 UI 元素。
由于 TextBlock 的内联 属性 不可绑定,您可以创建一个带有可绑定 属性 的 deribed TextBlock,如下所示:
public class MyTextBlock : TextBlock
{
public static readonly DependencyProperty BindableInlinesProperty =
DependencyProperty.Register(
nameof(BindableInlines),
typeof(IEnumerable<Inline>),
typeof(MyTextBlock),
new PropertyMetadata(null, BindableInlinesPropertyChanged));
public IEnumerable<Inline> BindableInlines
{
get { return (IEnumerable<Inline>)GetValue(BindableInlinesProperty); }
set { SetValue(BindingGroupProperty, value); }
}
private static void BindableInlinesPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var textblock = (MyTextBlock)o;
var inlines = (IEnumerable<Inline>)e.NewValue;
textblock.Inlines.Clear();
if (inlines != null)
{
textblock.Inlines.AddRange(inlines);
}
}
}
现在你可以像这样使用它
<local:MyTextBlock BindableInlines="{Binding SomeInlines}"/>
像这样的视图模型属性:
public IEnumerable<Inline> SomeInlines { get; set; }
...
var link = new Hyperlink(new Run("Search"));
link.NavigateUri = new Uri("http://search.msn.com");
link.RequestNavigate += (s, e) => Process.Start(e.Uri.ToString());
SomeInlines = new List<Inline>
{
new Run("Some text "),
link,
new Run(" and more text")
};