silverlight中的stackpanel可见性编辑

时间:2012-04-21 13:28:56

标签: asp.net visual-studio silverlight xaml visibility

我正在使用Silverlight Web应用程序(RIA)托管在Silverlight Web应用程序上。

背景:我在其中一个xaml页面中有一个stackpanel。我试图简化我的问题。它如下:

我的xaml页面有一个堆栈面板,该堆栈面板中只有文本块和按钮。只有授权用户才能在导航到xaml页面时看到文本块中的值。如果用户未经授权,我打算在文本块中显示“未授权”消息(而不是值)(按钮也会折叠。我不显示按钮。)

仅供参考,texblock的这个值来自WCF服务,我已经为服务中的授权做了适当的属性。如果未经授权,则不会从服务中获取文本块。我现在正在做的只是用户界面,当一些用户试图从浏览器的地址栏输入页面的网址时,我想向他显示未经授权的消息。

到目前为止我做了什么::我为stackpanel命名了。我给了textblock一个名字和一个名字给按钮。如果授权,我将文本块的文本值设置为服务返回值。

如果未经授权,我正在更改.cs文件中的可见性和文本。

textblock.Text="unauthorized";
buttonname.Visibility = Visibility.Collapsed;

问题:问题是我有个主意。 :(当我的stackpanel有一个名字时,我可以说     stackpanelname.Visibility = Visibility.Collapsed;

但我现在无法显示我的消息(Textblock),coz子控件也与父级一起折叠。有没有办法,我可以折叠我的stackpanel(父控件),但只有一个控件(一个子控件,或少数)是可见的。

解决方案:当我输入这个时,我得到了一个解决方案,我可以使用一个新的堆栈面板,一个文本块,其可见性我可以设置为VISIBLE并将文本作为我的消息。但是,这是唯一的方法吗?我们如何处理这些情况?

一般来说,假设我的问题很清楚,从UI开始,在这种场景中提供安全性的一般方法是什么。它是否会重定向到错误页面/登录页面或在同一页面或任何其他事物上向用户发送消息。假设,后端服务将具有授权的属性和逻辑。

1 个答案:

答案 0 :(得分:1)

通常我会用绑定来解决这个问题。我不确定你是否愿意接受这种方法,但鉴于你是这样。例如,我会这样做:

<TextBlock Text="{Binding AuthorizationCaption,FallbackValue='Unauthorized'" />

此处的回退值用于查看设计目的。仅当绑定失败时才会显示FallbackValues。

对于按钮,我会这样做:

<Button Content="My Button" Visibility="{Binding IsAuthorized,Converter={StaticResource VisibilityValueConverter},FallbackValue=Collapsed}" />

在上面的例子中,您会注意到我使用了我所谓的VisibilityValueConverter。这当然是我在XAML中定义的“LayoutRoot”资源的一部分。例如

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyUICustomizationLib;component/rdMyResourceDictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

My VisibilityValueConverter是一个简单的转换器,用于将布尔值转换为可见性属性。它非常可重复使用。它实现了 IValueConverter ,我认为它位于 System.Windows.Data 中。沿袭:

public class TVisibilityValueConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool _visibility = (bool)value;
        return _visibility ? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility _visibility = (Visibility)value;
        return _visibility == Visibility.Visible;
    }
}

我会在我的ResourceDictionary中嵌入我的值转换器,首先,为它的位置定义命名空间 -

xmlns:muicl="clr-namespace:MyUICustomizationLib.ValueConverters"

然后定义静态资源:

<muicl:TVisibilityValueConverter x:Key="VisibilityValueConverter" />

最后但并非最不重要的是,实现我的viewmodel属性和命令以适应必须的。即,我进行必要的服务器调用,并在回调时,我相应地切换AuthorizationCaption属性和IsAuthorized属性。最平滑的方法是让AuthorizationCaption成为一个依赖于IsAuthorized属性的简单if语句。让IsAuthorizedProperty的set方法引发AuthorizationCaption也发生了变化的事件通知。 e.g。

set
{
    __fIsAuthorized = value;//set private member
    this.RaisePropertyChanged("IsAuthorized");
    this.RaisePropertyChanged("AuthorizationCaption");
}

当然,他们可能会更多地建立在你的最后。但这将是我要采取的路线。