我是wpf的新手,这是我第一次尝试创建自定义用户控件。它的目的是显示两个值(myText1和myText2)及其相应的图像(myimage1,myimage2)。有时,其中一个值未设置,因此也应隐藏一个图像。这是我目前的代码:
Window1.xaml
<local:myControl myText2="Hello World!" />
myControl.xaml
<TextBlock Text="{Binding ElementName=myControl,Path=myText1}" />
<Image Source="myimage1.jpg" />
<TextBlock Text="{Binding ElementName=myControl,Path=myText2}" />
<Image Source="myimage2.jpg" />
myText1未在window1.xaml中设置,因此文本块保持为空。但图像仍然显示。如果未在window1.xaml中设置myText1(或myText2),我缺少哪些代码行来隐藏图像?
答案 0 :(得分:2)
您已将文本转换为可见性
public class TextToVisibilityConverter : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is string && targetType == typeof(bool))
{
if (value.ToString().Equals(string.Empty))
return Visibility.Hidden;
else
return Visibility.Hidden;
}
else
{
return null;
}
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is Visibility && targetType == typeof(string))
{
if ((Visibility)value == Visibility.Visible)
{
return "Text";
}
else
{
return string.Empty;
}
}
else
{
return null;
}
}
}
在XAML&lt; TextToVisibilityConverter x:Key =“myCnverter”/&gt;
答案 1 :(得分:1)
那里有一些小错误:
if (value is string && targetType == typeof(bool))
{
if (value.ToString().Equals(string.Empty))
return Visibility.Hidden;
else
return Visibility.Hidden;
}
应该是
if (value is string && targetType == typeof(Visibility))
{
if (value.ToString().Equals(string.Empty))
return Visibility.Hidden;
else
return Visibility.Visible;
}
您需要以下用途:
using System.Windows;
using System.Windows.Data;
您也可以考虑返回Visibility.Collapsed
而不是Visibility.Hidden
答案 2 :(得分:0)
一旦你创建了正确的转换器,那么很容易。 并没有太多的答案也得到Text.IsEmpty可用于TextBlock Text属性
我创建了一个BooleanVisibilityConverter,它取决于boolean对True或False的参数。 给你的!xaml缺少真正的灵活性。
public class BooleanVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility v = Visibility.Collapsed;
bool checkValue = true;
if(parameter != null)
{
checkValue = Boolean.Parse(parameter.ToString());
}
if(value.Equals(checkValue))
{
v = Visibility.Visible;
}
return v;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在你的xaml中将该命名空间导入:
xmlns:conv="clr-namespace:ConvertersNamespace"
在资源中创建转换器:
<UserControl.Resources>
<conv:BooleanVisibilityConverter x:Key="bool2vis" />
</UserControl.Resources>
然后只使用你的设计:
<TextBlock Text="{Binding ElementName=myControl,Path=myText1}" x:Name="txtBlock"/>
<Image Source="myimage1.jpg"
Visibility="{Binding ElementName=txtBlock,Path=Text.IsEmpty,
Converter={StaticResource bool2vis},ConverterParameter=False}"/>