1

我想根据属性有条件地加载 UserControl。如果属性为“true”,那么我们在 XAML 中加载 UserControl。假设该属性名为:IsCameraSupported。将其设置VisibilityCollapsed应该是正确的解决方案,因为我完全不想将它包含在 XAML 文件中。

有人可以给我一个代码示例来执行此操作,仅在 XAML 中吗?

非常感谢。

4

3 回答 3

0

编辑 我乍一看误解了这个问题。这是更新的响应。

您可以使用框架控件。在 Frame 控件中,您可以导航到具有相机控件的 Page。

如何从视图模型调用视图方法

  1. 从 View Model 中的 IsCameraSupported setter 触发事件。
  2. 订阅 View 到 View Model 事件
  3. 在视图代码后面的事件处理程序中调用 Frame.Navigate。

原始答案

您可以创建 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
}
于 2012-07-05T06:56:43.923 回答
-1

我会在你的if is的集合中使用ContentControlandDataTriggerContentTemplateUserControlIsCameraSupportedTrue

<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>
于 2012-07-05T13:35:26.247 回答
-1

当 yr bool 为 true 时,使用 Trigger 或 Converter 类将可见性设置为折叠

在运行时你可以这样做

if(IsCameraSupported)
{
    var myControl = new MyControl();
    MyCanvas.Children.Add(myControl);
    Canvas.SetLeft(myControl, 20);
    Canvas.SetTop(myControl, 20);

}
于 2012-07-05T06:56:31.970 回答