SilverLight企业应用框架设计【二】框架画面

框架画面分为上中下三层

由下面一个Grid控件完成布局

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="60"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="22"></RowDefinition>
        </Grid.RowDefinitions>
       </Grid>

上层为顶部菜单区域

中层为子菜单和业务画面部分

下层为状态栏和版权信息区域

下面我们分别看一下这三个部分的生成逻辑

一:顶部菜单区域

XAML代码如下:

        <StackPanel x:Name="TopMenuS" Orientation="Horizontal" Background="{StaticResource HeadBG}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="142"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="3"></RowDefinition>
                    <RowDefinition Height="18"></RowDefinition>
                    <RowDefinition Height="18"></RowDefinition>
                    <RowDefinition Height="18"></RowDefinition>
                    <RowDefinition Height="3"></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock x:Name="helloBlock" Grid.Column="1" Grid.Row="1" Text="xxxx通信" />
                <TextBlock x:Name="UserName" Text="Administrator" Grid.Column="1" Grid.Row="2" />
                <TextBlock Text="欢迎使用 xxx监控系统" Grid.Column="1" Grid.Row="3" />
            </Grid>
            <Rectangle Width="1" Fill="{StaticResource HeadSplitor}"></Rectangle>
            <StackPanel>
                <Button Style="{StaticResource ToolBtnStyle}" Content="全部关闭" Click="CloseAllClick"></Button>
                <Button Style="{StaticResource ToolBtnStyle}" Content="关闭当前" Click="CloseCurClick"></Button>
                <Button Style="{StaticResource ToolBtnStyle}" Content="关闭其他" Click="CloseOtherClick"></Button>
            </StackPanel>
            <Rectangle Width="1" Fill="{StaticResource HeadSplitor}"></Rectangle>
            <StackPanel>
                <Button Style="{StaticResource ToolBtnStyle}" Content="修改密码" Click="ChangePSWBtnClick"></Button>
                <Button Style="{StaticResource ToolBtnStyle}" Content="退出系统" Click="LoginOutBtnClick"></Button>
                <Button Style="{StaticResource ToolBtnStyle}" Content="重新登录" Click="ReLoginBtnClick"></Button>
            </StackPanel>
            <Rectangle Width="1" Fill="{StaticResource HeadSplitor}"></Rectangle>
        </StackPanel>

顶部菜单分为三部分

从左向右依次是

欢迎信息(GRID)

顶部菜单(动态创建)

常用按钮(StackPanel)

顶部菜单的容器是一个StackPanel

此容器有一个渐变的背景色,样式代码如下

    <!--头部渐变背景-->
    <LinearGradientBrush x:Key="HeadBG" StartPoint="0.5 0" EndPoint="0.5 1">
        <GradientStop Offset="0" Color="#FAFAFA"></GradientStop>
        <GradientStop Offset="0.5" Color="#D6D6D6"></GradientStop>
    </LinearGradientBrush>

此容器每个部分都有一个Rectangle来分割

此Rectangle也有个渐变的背景,代码如下

    <!--头部分隔条渐变背景-->
    <LinearGradientBrush x:Key="HeadSplitor" StartPoint="0.5 0" EndPoint="0.5 1">
        <GradientStop Offset="0" Color="#FAFAFA"></GradientStop>
        <GradientStop Offset="1" Color="#000000"></GradientStop>
    </LinearGradientBrush>

常用按钮的样式如下:

<!--头部的 三分栏  工具按钮样式-->
    <Style x:Key="ToolBtnStyle" TargetType="Button">
        <Style.Setters>
            <Setter Property="Width" Value="90"></Setter>
            <Setter Property="Height" Value="20"></Setter>
            <Setter Property="Cursor" Value="Hand"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid x:Name="Container">
                            <vsm:VisualStateManager.VisualStateGroups>
                                <vsm:VisualStateGroup x:Name="CommonStates">
                                    <vsm:VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/>
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Normal" />
                                </vsm:VisualStateGroup>
                            </vsm:VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="fillColor" Opacity="0" Fill="#B5B5B5"  IsHitTestVisible="False" RadiusX="1" RadiusY="1"/>
                            <ContentPresenter
    			                x:Name="contentPresenter"
    			                Content="{TemplateBinding Content}"
    			                ContentTemplate="{TemplateBinding ContentTemplate}"
    			                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
    			                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
    			                Margin="{TemplateBinding Padding}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>

动态创建顶部菜单的代码如下

大家先不要深究数据是怎么来的,在以后的章节咱们会讲到数据交互的细节

            var tops = Common.ViewUtility.AllMenu
                .Where(m => m.ParentId == Guid.Empty)
                .OrderByDescending(m => m.MenuOrder);
            foreach (var m in tops)
            {
                var topM = new HeadBtn();
                topM.DataContext = m;
                topM.MouseLeftButtonUp += new MouseButtonEventHandler(topM_MouseLeftButtonUp);
                TopMenuS.Children.Insert(2,topM);
            }

这里创建的HeadBtn是一个自定义的控件

(每个顶部菜单就是一个控件的实例)

该自定义控件XAML代码如下:

    <StackPanel Orientation="Horizontal" Cursor="Hand">
        <Grid x:Name="btn" Width="90" Height="60">
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="20"></RowDefinition>
            </Grid.RowDefinitions>
            <Image Source="../Images/module2.png" Height="30"></Image>
            <TextBlock Text="{Binding MenuName}" Grid.Row="1" FontSize="12"
                       VerticalAlignment="Center" HorizontalAlignment="Center" ></TextBlock>
        </Grid>
        <Rectangle Width="1" Fill="{StaticResource HeadSplitor}"></Rectangle>
    </StackPanel>

注意,这里每个顶部菜单的ICO图标不是动态的,朋友们,想让他变成动态的就自己动手吧

为了实现美观的效果

我为这个自定义控件定义了鼠标的滑入滑出事件

        private void UserControl_MouseEnter(object sender, MouseEventArgs e)
        {
            var color = Color.FromArgb(255,180, 180, 180);
            btn.Background = new SolidColorBrush(color);
        }
        private void UserControl_MouseLeave(object sender, MouseEventArgs e)
        {
            btn.Background = new SolidColorBrush(Colors.Transparent);
        }

这些颜色的值,本应该作为资源放在样式文件中,我这里也没有做处理

二:底部状态条区域

此处比较简单

代码如下:

        <StackPanel Width="Auto" Grid.Row="2"
                    Background="#B5B5B5" Orientation="Horizontal" FlowDirection="RightToLeft">
            <TextBlock VerticalAlignment="Center" Text="V1.0.0 Copy Right  All Rights Reserved"/>
            <TextBlock VerticalAlignment="Center"  Text="xxxx"/>
        </StackPanel>

1.我没有做状态信息的内容

2.版本信息应该通过Assambly获取

三:中部区域

XAML代码如下

        <Border  Grid.Row="1" BorderBrush="#B5B5B5" BorderThickness="0 1 0 0">
            <Grid  Background="#E8E8E8" Margin="0 1 0 0" Name="CenterGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="160"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <StackPanel>
                    <sdk:Label  Height="26"  Background="#b5b5b5"  Margin="0 6 0 6"
                                FontWeight="Bold" FontSize="12" x:Name="lblMenuText"
                                HorizontalAlignment="Center"  Width="160"  />
                    <ListBox  SelectionChanged="left_panel_SelectionChanged"
                               ItemContainerStyle="{StaticResource ListBoxItemStyleNew}"
                               Grid.Column="0" x:Name="left_panel" Background="#E8E8E8" BorderThickness="0">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <ContentPresenter Content="{Binding MenuName}"></ContentPresenter>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>
                <sdk:TabControl x:Name="tbControl" SelectionChanged="tbControl_SelectionChanged" Grid.Column="1" Margin="0 6 0 0">
                </sdk:TabControl>
            </Grid>
        </Border>

其中Label控件显示的为顶部菜单的标题,标志着当前选中的是哪个顶部菜单

ListBox为子菜单控件

TabControl为业务画面区域

四:子菜单区域

子菜单样式相对复杂些

样式代码如下

<!--子菜单样式-->
    <Style TargetType="ListBoxItem" x:Key="ListBoxItemStyleNew" >
        <Setter Property="Padding" Value="3" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="TabNavigation" Value="Local" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Grid Background="{TemplateBinding Background}">
                        <vsm:VisualStateManager.VisualStateGroups>
                            <vsm:VisualStateGroup x:Name="CommonStates">
                                <vsm:VisualState x:Name="Normal" />
                                <vsm:VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity" Duration="0" To=".35"/>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity" Duration="0" To=".55" />
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                            <vsm:VisualStateGroup x:Name="SelectionStates">
                                <vsm:VisualState x:Name="Unselected" />
                                <vsm:VisualState x:Name="Selected">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="fillColor2" Storyboard.TargetProperty="Opacity" Duration="0" To=".75"/>
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                            <vsm:VisualStateGroup x:Name="FocusStates">
                                <vsm:VisualState x:Name="Focused">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Visibility" Duration="0">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Unfocused"/>
                            </vsm:VisualStateGroup>
                        </vsm:VisualStateManager.VisualStateGroups>
                        <Rectangle x:Name="fillColor" Opacity="0" Fill="#B5B5B5"  IsHitTestVisible="False" RadiusX="1" RadiusY="1"/>
                        <Rectangle x:Name="fillColor2" Opacity="0" Fill="#FFBADDE9" IsHitTestVisible="False" RadiusX="1" RadiusY="1"/>
                        <ContentPresenter
                              x:Name="contentPresenter"
                                Cursor="Hand"
                              Content="{TemplateBinding Content}"
                              ContentTemplate="{TemplateBinding ContentTemplate}"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                              Margin="{TemplateBinding Padding}"/>
                        <Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed" RadiusX="1" RadiusY="1" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这些样式主要是为了实现如下效果

子菜单数据绑定非常简单

(顶部菜单的单击事件将绑定子菜单)

代码如下:

        void topM_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            var tBTN = sender as HeadBtn;
            var tMenu = tBTN.DataContext as MenuM;
            lblMenuText.Content = tMenu.MenuName;
            var subs = Common.ViewUtility.AllMenu
                .Where(m => m.ParentId == tMenu.Id)
                .OrderBy(m => m.MenuOrder);
            left_panel.ItemsSource = subs;
        }

五:业务画面区域

业务画面的容器为TabControl

每个TabItem将承载一个业务画面

主要是为TabItem增加关闭按钮

XAML代码如下:

    <sdk:TabItem.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Width="auto" Margin="0 0 -2 -2">
                <TextBlock  x:Name="tboxheader" Text="{Binding}"/>
                <Button Cursor="Hand" Click="CloseBTN_Click" Style="{StaticResource ListViewHeadBtnStyle}" Margin="3,-3,-6,0"  Content="X" >
                </Button>
            </StackPanel>
        </DataTemplate>
    </sdk:TabItem.HeaderTemplate>
    </sdk:TabItem>

这个关闭按钮的样式比较特殊

    <!--标签按钮-->
    <Style x:Key="ListViewHeadBtnStyle" TargetType="Button">
        <Style.Setters>
            <Setter Property="Width" Value="20"></Setter>
            <Setter Property="Height" Value="20"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid  x:Name="Container">
                            <vsm:VisualStateManager.VisualStateGroups>
                                <vsm:VisualStateGroup x:Name="CommonStates">
                                    <vsm:VisualState x:Name="Normal" />
                                    <vsm:VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity" Duration="0" To=".35"/>
                                        </Storyboard>
                                    </vsm:VisualState>
                                </vsm:VisualStateGroup>
                            </vsm:VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="fillColor" Opacity="0" Fill="#B5B5B5"  IsHitTestVisible="False" RadiusX="1" RadiusY="1"/>
                            <ContentPresenter
    			                x:Name="contentPresenter"
    			                Content="{TemplateBinding Content}"
    			                ContentTemplate="{TemplateBinding ContentTemplate}"
    			                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
    			                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
    			                Margin="{TemplateBinding Padding}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>

关闭按钮样式主要为了实现如下效果

(鼠标滑上,关闭按钮背景变灰色)

按钮的单击事件如下

        private void CloseBTN_Click(object sender, RoutedEventArgs e)
        {
            var tc = this.Parent as TabControl;
            tc.Items.Remove(this);
        }
时间: 2024-09-20 00:01:15

SilverLight企业应用框架设计【二】框架画面的相关文章

javascript框架设计之框架分类及主要功能

这篇文章主要介绍了javascript框架设计之框架分类及主要功能的相关资料,需要的朋友可以参考下 从内部架构和理念划分,目前JavaScript框架可以划分为5类. 第一种是以命名空间为导向的类库或框架,如果创建一个数组用new Array(),生成一个对象用new Object(),完全的java风格,因此,我们以某一对象为跟,不断为它添加对象和二级对象属性来组织代码,如金字塔般垒起来,早期代表YUI,EXT(so,不是有活力的公司都还用它们) 第二种是以类工厂为导向的框架.著名的有Prot

.NET框架设计(高级框架架构模式)—钝化程序、逻辑冻结、冻结程序的延续、瞬间转移

阅读目录: 1.开篇介绍 2.程序书签(代码书签机制) 2.1ProgramBookmark 实现(使用委托来锚点代码书签) 2.2ProgramBookmarkManager书签管理器(对象化书签集合的处理,IEnumerable<T>书签管理)  3.可恢复语句组件(将语句对象化) 3.1可恢复语句组件管理器(将可恢复语句视为普通的对象成员,IEnumerable<T>可恢复语句组件) 3.2可恢复语句组件运行时(Program CLR(简介)) 3.3可恢复语句逻辑配置(规则

javascript框架设计之框架分类及主要功能_javascript技巧

从内部架构和理念划分,目前JavaScript框架可以划分为5类. 第一种是以命名空间为导向的类库或框架,如果创建一个数组用new Array(),生成一个对象用new Object(),完全的java风格,因此,我们以某一对象为跟,不断为它添加对象和二级对象属性来组织代码,如金字塔般垒起来,早期代表YUI,EXT(so,不是有活力的公司都还用它们) 第二种是以类工厂为导向的框架.著名的有Prototype,还有mootools.Base2.Ten,它们基本上除了最基本的命名空间,其它模块都是一

Silverlight MMORG WebGame游戏设计(二) 通讯协议之惑

晚上看到我在silverlight webGame上的导师"深蓝色右手"拿到荣誉,觉得他名至实归.回想自己2010过年来到北京忙于一些琐屑的事情,好久没有动手写我的 web传奇了. 去年在群里说我过年要开源我的Web传奇,写一些服务端的文章.后来我发现自己在服务端开发上经验还欠 缺,还没有一个成熟的框架,自己也在摸索中,我也打算今年向公司用C++写服务端的同事学下. 在2009年10月份,我就打算写服务端,可我两眼一抹黑,用什么语言写,用什么通讯方式?作为一个6年来 一直用C#的人来说

ThinkPHP框架设计及扩展详解_php实例

ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一些简单的开发示例中来深入了解一下这个框架给我们带来的开发便捷性,以及游刃有余的扩展设计.同时也从源码分析的角度看看框架的一些不足,尽量做全面客观的评价.这里假设大家已经使用过ThinkPHP框架,基本使用方法请参考官方文档. 一.框架分层及url路由 框架的安装非常简单,下载后放入web服务器的目录即可,但是建议大家不要用默认的入口文件位置,而是放入单独的目录,便于保护代码和数据.例如我的入口文件和web服务器配置目录在web目

.NET架构设计、框架设计系列文章总结

从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以在发挥点价值作用.     架构设计: ElasticSearch大数据分布式弹性搜索引擎使用 (推荐) DDD实施经验分享-价值导向.从上往下进行(圈内第一个吃螃蟹DDD实施方案)(推荐) 软件工程-思考项目开发那些事(一)(推荐) SOA架构设计经验分享-架构.职责.数据一致性(推荐) .NET

APP 自动化框架设计思路分享

APP自动化框架设计分享 框架需要解决的问题: • 渠道包->多渠道包核心用例自动化 • 多设备覆盖安装,安装卸载更新等测试 • 多设备核心用例适配测试 • 验证主要页面(包括webview)检查是否加载成功 • 离线主流程覆盖 • 一些重复性操作可以通过框架简单实现 框架目标定位: • 让Tester无需编写代码 通过简单数据驱动方式实现通用简单的自动化 • 跟开发约定一些UI上的元素标准和规范建立自动化规范流程化 • 结合实时抓包组件和性能监控插件方便分节点定位问题 • 自动异常捕获,Cra

SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)

来个索引 SilverLight企业应用框架设计[四]实体层设计+为客户端动态生成服务代理(自己实现RiaService) SilverLight企业应用框架设计[三]服务端设计 SilverLight企业应用框架设计[二]框架画面 SilverLight企业应用框架设计[一]整体说明   在上一节中讲到的自动生成的服务代理类核心代码,如下 public event ServiceEventHandler Completed; public void GetAllMenu() { var si

Silverlight企业应用框架设计【六】自定义系统菜单(使用自己的DataForm)

索引 SilverLight企业应用框架设计[五]客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务) SilverLight企业应用框架设计[四]实体层设计+为客户端动态生成服务代理(自己实现RiaService) SilverLight企业应用框架设计[三]服务端设计 SilverLight企业应用框架设计[二]框架画面 SilverLight企业应用框架设计[一]整体说明   首先我们设计的窗体如下 xaml代码如下: <location:BasePage x:Cl

SilverLight企业应用框架设计【一】整体说明

Silverlight企业应用框架设计[六]自定义系统菜单(使用自己的DataForm) SilverLight企业应用框架设计[五]客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务) SilverLight企业应用框架设计[四]实体层设计+为客户端动态生成服务代理(自己实现RiaService) SilverLight企业应用框架设计[三]服务端设计 SilverLight企业应用框架设计[二]框架画面 SilverLight企业应用框架设计[一]整体说明 闲言碎语~