2012-07-05 157 views
1

我想根据属性有条件地加载用户控件。如果该属性为“true”,那么我们将用户控件加载到XAML中。假设该酒店被命名为:IsCameraSupported。将Visibility设置为Collapsed如果不是是正确的解决方案,因为我完全不希望将其包含在XAML文件中。有条件地加载用户控件

有人可以给我一个代码示例来做到这一点,只在XAML?

非常感谢。

回答

-1

使用触发器或设置能见度倒塌时年布尔运行时也是如此

一个转换器类哟能做到这一点

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

} 
+0

看来你还没有明白我的意思。如果属性为false,我不想包含UserControl。将可见性设置为折叠状态仍将加载UserControl,但不可见并且不占用空间。 –

+0

而且你绝对不想在运行时使用代码/设置代码 – JohnnBlade

0

编辑 我误解了这个问题乍看。这是更新后的回复。

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

如何从视图模型

  1. 火从视图模型IsCameraSupported二传手事件调用视图的方法。
  2. 订阅查看模型事件
  3. 调用Frame.Navigate在视图代码后面的事件处理程序中。

原来的答案

您可以创建BooleanToVisibilityConverter,并使用数据绑定。

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 
} 
+0

设置可见性不是解决方案,因为它仍将加载UserControl并执行一些初始化过程。 –

-1

我会用一个ContentControl,并在DataTriggerContentTemplate设为您的UserControl如果IsCameraSupportedTrue

<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>