我有四个按钮。
当用户单击任何按钮时,我希望标签中的文本以及右侧箭头如下图所示。
可能吗?
我真正想要的是:
a 的内容Button
几乎可以是任何东西。您可以使用 WPF 的几何图元绘制右箭头,并使用面板将其与文本放在一起。
但是,在您的情况下TextBlock
,使用额外Run
的 Webdings 字体就足够了:
<Button>
<TextBlock>Bitmaps <Run FontFamily="Webdings">4</Run></TextBlock>
</Button>
我仍然不清楚您在问什么,但让我尝试提供更多信息。
我的意思是使用 vb.net 或 c# 而不是 xaml?
在 WPF 中,您通常希望在 XAML 中设计 UI,然后在 XAML 中命名元素并从代码隐藏进行访问,或者使用数据绑定绑定到视图模型(MVVM 样式)。但是,XAML 只是一种用于声明对象图的符号,如果您愿意,可以在代码中构建该对象图:
var textBlock = new TextBlock();
textBlock.Text = "Bitmaps ";
var run = new Run();
run.Text = "4";
run.FontFamily = new FontFamily("Webdings");
textBlock.Inlines.Add(run);
var button = new Button();
button.Content = textBlock;
与 C# 版本相比,我发现 XAML 更容易理解。
如果您真正想要做的是拥有一个动态用户界面,而您不知道如何使用 XAML 来实现,我在这里演示如何使用 MVVM 来实现。最初,我创建了一个非常简单的视图模型,其中包含要显示的项目:
class ViewModel {
public ViewModel() {
Items = new ObservableCollection<String>();
}
public ObservableCollection<String> Items { get; private set; }
}
在我的代码中,我需要创建视图模型并将其设置为所显示的任何内容(通常是窗口、用户控件或页面)的数据上下文。为简单起见,我在窗口的构造函数中执行此操作:
public MainWindow() {
InitializeComponent();
var viewModel = new ViewModel();
viewModel.Items.Add("Computer");
viewModel.Items.Add("SetUp (D:)");
viewModel.Items.Add("DELL Webcam");
viewModel.Items.Add("Bitmaps");
DataContext = viewModel;
}
要显示我使用此 XAML 的项目列表:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Inlines>
<Run Text="{Binding Mode=OneWay}"/>
<Run Text="4" FontFamily="Webdings"/>
<Run Text=" "/>
</TextBlock.Inlines>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
每个项目都使用 aTextBlock
和额外的来呈现Run
三角形以显示三角形。然后使用StackPanel
.
该ViewModel.Items
集合是使用实现的,ObservableCollection<T>
因此当在运行时添加或删除项目时,用户界面会相应地更新,而无需任何额外的 C# 代码。所有这些都由 WPF 中的数据绑定框架处理。