我想根据属性有条件地加载 UserControl。如果属性为“true”,那么我们在 XAML 中加载 UserControl。假设该属性名为:IsCameraSupported
。将其设置Visibility
为不Collapsed
应该是正确的解决方案,因为我完全不想将它包含在 XAML 文件中。
有人可以给我一个代码示例来执行此操作,仅在 XAML 中吗?
非常感谢。
编辑 我乍一看误解了这个问题。这是更新的响应。
您可以使用框架控件。在 Frame 控件中,您可以导航到具有相机控件的 Page。
如何从视图模型调用视图方法
原始答案
您可以创建 BooleanToVisibilityConverter,并使用 DataBinding。
http://www.rhyous.com/2011/02/22/binding-visibility-to-a-bool-value-in-wpf/
http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx
转换器代码
public class BooleanVisibilityConverter : IValueConverter
{
#region Constructors
public BooleanVisibilityConverter()
: this(true)
{ }
public BooleanVisibilityConverter(bool collapseWhenInvisible)
: base()
{
CollapseWhenInvisible = collapseWhenInvisible;
}
#endregion
#region Properties
public bool CollapseWhenInvisible { get; set; }
public Visibility FalseVisibility
{
get
{
if (CollapseWhenInvisible)
return Visibility.Collapsed;
else
return Visibility.Hidden;
}
}
#endregion
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return Visibility.Visible;
if ((bool)value)
return Visibility.Visible;
else
return FalseVisibility;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return true;
return ((Visibility)value == Visibility.Visible);
}
#endregion
}
我会在你的if is的集合中使用ContentControl
andDataTrigger
ContentTemplate
UserControl
IsCameraSupported
True
<DataTemplate x:Key="MyUserControlTemplate">
<local:MyUserControl />
</DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Property="{Binding IsCameraSupported}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource MyUserControlTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
当 yr bool 为 true 时,使用 Trigger 或 Converter 类将可见性设置为折叠
在运行时你可以这样做
if(IsCameraSupported)
{
var myControl = new MyControl();
MyCanvas.Children.Add(myControl);
Canvas.SetLeft(myControl, 20);
Canvas.SetTop(myControl, 20);
}