带关闭按钮的WPF自定义TabItem

时间:2013-04-13 22:04:11

标签: c# wpf xaml tabitem

我正在使用WPF和C#。我正在尝试创建一个包含关闭按钮的自定义TabItem。我确实遵循了一个教程,并设法让它工作 - 但我想使用图像作为我的关闭按钮。在尝试这个时,我遇到了一些例外。

System.Deployment.dll中发生'System.Deployment.Application.InvalidDeploymentException'类型的第一次机会异常 mscorlib.dll中发生了'System.IO.DirectoryNotFoundException'类型的第一次机会异常 在PresentationCore.dll中发生了'System.IO.DirectoryNotFoundException'类型的第一次机会异常 mscorlib.dll中出现'System.IO.DirectoryNotFoundException'类型的第一次机会异常

我相信这是抱怨没有找到图像源。要设置图像源,我使用了属性窗格,并在“源”下拉菜单中选择了相应的资源。这应该没问题,但它根本不好。

我想知道是否有人能给我一些关于该做什么的提醒?这很奇怪,因为如果说没有找到资源,那么资源就在那里。我使用Resources.resx添加了图像,并将它们添加到我的Resources文件夹中。它就在那里......只是我的XAML不喜欢它。

这是我的XAML

<UserControl x:Class="WpfApplication1.CloseableHeader"
  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" 
  mc:Ignorable="d" 
  d:DesignHeight="23" d:DesignWidth="81" Margin="0">
<UserControl.Resources>
    <Style TargetType="Button" x:Key="close_hover">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Image Source="pack://siteoforigin:,,,/Resources/CloseIco.png" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="Button" x:Key="close_normal">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Image Source="pack://siteoforigin:,,,/Resources/CloseIco_BW.png" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid>
    <Button
        Name="button_close"
        ToolTip="Close"
        HorizontalAlignment="Right"
        VerticalAlignment="Center"
        Margin="0,0,5,0"
        Width="14"
        Height="14"
        Style="{DynamicResource close_normal}"/>
    <Label Content="TabItem"  Height="23" HorizontalAlignment="Left" 
      Margin="4,1,0,0" Name="label_TabTitle" VerticalAlignment="Top" 
      FontFamily="Courier" FontSize="12" />
</Grid>

我还应该注意,在Visual Studio的Designer视图中,它会显示应该显示的选项卡(带有图像!)。

提前致谢。


更新


我现在已经进一步完成了我的项目,我遇到的唯一问题是Visual Studio上的路径不存在,但是当我调试时 - 它们确实存在。资源文件夹位于bin / Debug内,因此图像将在调试时显示...但这意味着我将始终在Designer中出现错误。有没有办法解决这个问题,这对两者都有用?

这是更新的XAML(相当大的变化)

<UserControl x:Class="WpfApplication1.CloseableHeader"
  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" 
  mc:Ignorable="d" 
  d:DesignHeight="23" Margin="0">
<UserControl.Resources>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Name="border"
                            BorderThickness="0"
                    >
                        <Border.Background>
                            <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/CloseIco_BW.png" />
                        </Border.Background>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" TargetName="border">
                                <Setter.Value>
                                    <ImageBrush ImageSource="pack://siteoforigin:,,,/Resources/CloseIco.png" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<Grid Background="White">
    <Button
        Name="button_close"
        ToolTip="Close"
        HorizontalAlignment="Right"
        VerticalAlignment="Center"
        Margin="0,0,5,0"
        Width="14"
        Height="14"/>
    <Label Content="TabItem"  Height="23" HorizontalAlignment="Left" 
      Margin="4,1,19,0" Name="label_TabTitle" VerticalAlignment="Top" 
      FontFamily="Courier" FontSize="12" />
</Grid>

1 个答案:

答案 0 :(得分:0)

使用Stackpanel组件,可以更轻松地将按钮设置为(或任何您想要的)按钮。这里的按钮将“close.ico”作为图标,“Close”作为文本水平排列

    <Button Name="button_close">
     <StackPanel Orientation="Horizontal">
      <Image Source="Resources\close.ico" Width="14" Height="14" />
      <TextBlock>
       <Run Text="Close" />
      </TextBlock>
     </StackPanel>
    </Button>

<Button Name="button_close"> <StackPanel Orientation="Horizontal"> <Image Source="Resources\close.ico" Width="14" Height="14" /> <TextBlock> <Run Text="Close" /> </TextBlock> </StackPanel> </Button>

回到你的问题,通过pack-URI设置资源地址你不会显示(实际上,加载),除非你玩嵌入式资源/内容构建操作的一些技巧 - 但是你需要提供文件与应用程序; 改为使用直接链接(Resources \ close.ico)