如果文本框具有文本WPF,则在tabcontrol选项卡标题中显示图像

时间:2014-09-08 14:39:09

标签: c# wpf tabcontrol

好的,我正在努力实现的目标:

如果文本框内有文本,则获取图像的tabheader。但如果TabItem中的文本框没有任何文本,则不应显示图像。

这是我到目前为止所做的:

----- TAB项目代码-----

            <TabItem Name="tabAantekeningen"  Header="">
                <TabItem.HeaderTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition></ColumnDefinition>
                                <ColumnDefinition></ColumnDefinition>
                            </Grid.ColumnDefinitions>

                            <TextBlock Grid.Column="0" Margin="8" Text="Aantekeningen"/>
                            <Image Grid.Column="1" Source="..\Resources\validate.png" Height="20" Width="17"/>
                        </Grid>
                    </DataTemplate>
                </TabItem.HeaderTemplate>
                <TextBox Name="txtOmschrijving" TextWrapping="Wrap" AcceptsReturn="True"></TextBox>
            </TabItem>

----- TAB项目代码-----

-----背后的代码-----

    public void SetTabItemHeader()
    {
        if (String.IsNullOrEmpty(txtOmschrijving.Text))
        {
            tabAantekeningen.Header = "Aantekeningen";
        }
    }

-----背后的代码-----

有没有办法可以说:txtOmschrijving.Text ==清空所以隐藏图片?

1 个答案:

答案 0 :(得分:1)

编辑:没有在那里看到你的第二个问题,是的,使用了 IValueConverter ,你可以检查字符串是否为空并且绑定到可见性,例如你返回Visbility.Collapsed空时或Visbility.Visible。 像这样:

public class StringEmptyToVisbililityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null) || !(value is string) || string.IsNullOrEmpty(value.ToString()) ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

完全正常工作xaml,更改名称空间和URI包

<Window x:Class="TabItemHeader.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:local="clr-namespace:TabItemHeader"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:StringEmptyToVisbililityConverter x:Key="StringEmptyToVisbililityConverter"/>
</Window.Resources>
<Grid>        
    <TabControl>
        <TabItem Name="tabAantekeningen">
            <TabItem.HeaderTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Margin="8" Text="{Binding Path='Header',RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}}"/>
                        <Image Grid.Column="1" Source="pack://application:,,,/TabItemHeader;component/Resources/Images/validate.png" Height="20" Width="17" Visibility="{Binding Path='Header', Converter={StaticResource StringEmptyToVisbililityConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}}"/>
                    </Grid>
                </DataTemplate>
            </TabItem.HeaderTemplate>
            <TextBox Name="txtOmschrijving" TextWrapping="Wrap" AcceptsReturn="True"></TextBox>
        </TabItem>
    </TabControl>
</Grid>

这将绑定到listboxitem,它将所有内容包装在列表框中。转换器仅在字符串不为空时才显示此图像。你可以和他们一起玩很多乐趣:)

<强> WPF cheat sheet is a really handy and compact paper on all types of bindings.

哦..我假设这张图片会随你的应用程序一起部署?然后请确保您的图片已设置为资源,您应该考虑使用uri packs以及图片,example is in this post以及提供的xaml。如果您的图像是动态的,则必须将它们绑定到observablecollection中的某个模型。 提示:我会停止将此推向远,但您应该考虑查看MVVM模式。我只是在自己背后使用代码,所以答案不会变得很大。这是另一个话题! =)还有更简洁的方法来共享模板,并在集合中绑定的类型上更改模板。

希望它有所帮助。

干杯,

了Stian