在WPF中,如何从ToolBar继承并拥有XAML文件?

时间:2009-09-25 12:48:05

标签: c# wpf xaml user-controls

我可以通过创建一个简单的C#类来继承和增强ToolBar类,然后这样做:

public class NiceToolBar : ToolBar
{
    private ToolBarTray mainToolBarTray;

    public NiceToolBar()
    {
        mainToolBarTray = new ToolBarTray();

        mainToolBarTray.IsLocked = true;
        this.Background = new SolidColorBrush(Colors.LightGray);
        ...

但这迫使我操纵代码中的所有控件,如下所示:

ToolBar toolBar = new ToolBar();
toolBar.Background = new SolidColorBrush(Colors.Transparent);
toolBar.Cursor = Cursors.Hand;

StackPanel sp = new StackPanel();
sp.Orientation = Orientation.Horizontal;

TextBlock tb = new TextBlock();
tb.Text = label;
tb.Margin = new Thickness { Top = 3, Left = 3, Bottom = 3, Right = 10 };

Image image = new Image();
image.Source = new BitmapImage(new Uri("Images/computer.png", UriKind.Relative));

sp.Children.Add(image);
sp.Children.Add(tb);
toolBar.Items.Add(sp);

我真正需要的是 XAML 来执行这个繁琐的参数分配和布局。

所以我创建了一个新用户控件并更改后面的代码以继承ToolBar:

public partial class SmartToolBar : ToolBar
{
    public SmartToolBar(string label)
    {
        InitializeComponent();

        TheLabel.Text = label;
    }
}

在我的XAML中,我把它放在了:

<UserControl x:Class="TestUserControl.Helpers.SmartToolBar"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Orientation="Horizontal">
        <Image Source="Images/computer.png"/>
        <TextBlock x:Name="TheLabel"/>
    </StackPanel>
</UserControl>

但是当我运行它时,我收到错误:

  

部分声明   “TestCallConstructor.Helpers.SmartToolBar”   可能没有定义不同的基础类

如何让我的用户控制 with XAML?

2 个答案:

答案 0 :(得分:3)

如果您继承自UserControl,则不会撰写ToolBar,因为ToolBar不会继承UserControl。当您的C#指定UserControl时,您的XAML将基类指定为ToolBar。显然那里存在冲突。

我不明白你首先在代码背后做这些事情的前提。为什么不将ToolBar的{​​{1}}绑定到您的项目集合,并使用通常的ItemsSource属性来控制渲染?

答案 1 :(得分:3)

您正在寻找自定义控件(而不是UserControl)。编写自定义控件时,可以指定其默认视图(即XAML)。

您可以谷歌如何在WPF中创建自定义控件,但这里是我为您搜索的一个链接How to Create a WPF Custom Control

希望这会有所帮助:)。