Silverlight实用窍门系列:69.Silverlight的ScrollViewer

本文详细介绍了Silverlight中ScrollViewer控件的使用方法及其属性,包括如何设置和获取滚动条的可见性和偏移量等,并提供了一个具体的应用实例。

 ScrollViewer在Silverlight中是一个很常用的控件,它有以下一些常用可设置属性:

  HorizontalScrollBarVisibility:水平方向滚动条

  VerticalScrollBarVisibility:垂直方向滚动条,其值为ScrollBarVisibility枚举类型分为

    Disabled:不显示,但是可以通过鼠标或者键盘移动文字内容

    Auto:根据内容宽度和高度自动决定是否出现滚动条

    Hidden:总是隐藏滚动条,无法移动被遮挡的内容

    Visible:总是显示滚动条

  ScrollToHorizontalOffset:设置ScrollViewer的内容水平偏移量

  ScrollToVerticalOffset:设置ScrollViewer的内容垂直偏移量

 

  Scrollviewer的只可获取属性如下:

  VerticalOffset:内容的垂直偏移量

  HorizontalOffset:内容的水平偏移量

  ExtentHeight:内容的总垂直高度

  ExtentWidth:内容的总水平宽度

  ViewportHeight:可见内容的垂直高度

  ViewportWidth:可见内容窗口的水平宽度

  ActualHeight:ScrollViewer控件的实际高度

  ActualHeight:ScrollViewer控件的实际宽度

  下面我们通过一个实例来看ScrollViewer的具体应用以及获取他们的值,Xaml代码如下:

    <Grid x:Name="LayoutRoot" Background="White">
        <Canvas>
            <ScrollViewer Name="sView" Height="300" Width="300" 
                          HorizontalScrollBarVisibility="Auto"
                          VerticalScrollBarVisibility="Auto" >
                <ScrollViewer.Content>
                    <Canvas  Height="400" Width="400">
                        <Rectangle  Name="retBlue" Width="200" Height="200" Fill="#FF45C2AD" />
                        <Rectangle  Name="retBlue2" Width="200" Height="200" 
                                    Fill="#FFC24588" Canvas.Left="200"  />
                        <Rectangle  Name="retBlue3" Width="200" Height="200"
                                    Fill="#FFB8C245"  Canvas.Top="200" />
                        <Rectangle  Name="retBlue4" Width="200" Height="200"
                                    Fill="#FF4532AD"  Canvas.Top="200" Canvas.Left="200" />
                    </Canvas>
                </ScrollViewer.Content> 
        </ScrollViewer>
            <Button Canvas.Left="314" Canvas.Top="45" Content="设 置"
                    Height="23" Name="button1" Width="75" Click="button1_Click" />
            <Button Canvas.Left="314" Canvas.Top="85" Content="查 看" 
                    Height="23" Name="button2" Width="75" Click="button2_Click" />
            <sdk:Label Canvas.Left="14" Canvas.Top="306" Height="28" Name="label1" Width="125" />
            <sdk:Label Canvas.Left="175" Canvas.Top="306" Height="28" Name="label2" Width="125" />
            <sdk:Label Canvas.Left="14" Canvas.Top="332" Height="28" Name="label3" Width="125" />
            <sdk:Label Canvas.Left="175" Canvas.Top="332" Height="28" Name="label4" Width="125" />
            <sdk:Label Canvas.Left="14" Canvas.Top="358" Height="28" Name="label5" Width="125" />
            <sdk:Label Canvas.Left="175" Canvas.Top="358" Height="28" Name="label6" Width="125" />
            <sdk:Label Canvas.Left="13" Canvas.Top="384" Height="28" Name="label7" Width="125" />
            <sdk:Label Canvas.Left="174" Canvas.Top="384" Height="28" Name="label8" Width="125" />
        </Canvas>
    </Grid>

  然后我们来看其cs后台代码如下:

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        bool show = true;
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (show)
            {
                //设置ScrollViewer的内容水平偏移量
                this.sView.ScrollToHorizontalOffset(50);
                //设置ScrollViewer的内容垂直偏移量
                this.sView.ScrollToVerticalOffset(50);
            }
            else
            {
                this.sView.ScrollToHorizontalOffset(0);
                this.sView.ScrollToVerticalOffset(0);
            }
            show = !show;
           
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //内容的垂直偏移量
            string vo = sView.VerticalOffset.ToString();
            //内容的水平偏移量
            string ho = sView.HorizontalOffset.ToString();
            //内容的总垂直高度
            string eh = sView.ExtentHeight.ToString();
            //内容的总水平宽度
            string ew = sView.ExtentWidth.ToString();
            //可见内容的垂直高度
            string vh = sView.ViewportHeight.ToString();
            //可见内容窗口的水平宽度
            string vw = sView.ViewportWidth.ToString();
            //ScrollViewer控件的实际高度
            string ah = sView.ActualHeight.ToString();
            //ScrollViewer控件的实际宽度
            string aw = sView.ActualHeight.ToString();
            this.label1.Content = "VerticalOffset:" + vo;
            this.label2.Content = "HorizontalOffset:" + ho;
            this.label3.Content = "ExtentHeight:" + eh;
            this.label4.Content = "ExtentWidth:" + ew;
            this.label5.Content = "ViewportHeight:" + vh;
            this.label6.Content = "ViewportWidth:" + vw;
            this.label7.Content = "ActualHeight:" + ah;
            this.label8.Content = "ActualHeight:" + aw;
            sView.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
        }

    }

  最后如需源码请点击 SLScrollView.zip 下载,实例效果图如下:


 


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/895166


<!--由代码生成工具生成--> <UserControl x:Class="MES.Client.Tooling.UserControls.ModifyMeasuringFaliureTracing" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:local="clr-namespace:MES.Client.Tooling.UserControls" xmlns:hc1="clr-namespace:Minio.DataModel;assembly=Minio" d:DataContext="{d:DesignInstance Type=local:ModifyMeasuringFaliureTracingViewModel}" mc:Ignorable="d" d:DesignHeight="350" d:DesignWidth="600"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MES.Client.UICommon;component/Styles/CommStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <hc:DialogContainer> <Border CornerRadius="3" Background="{DynamicResource DialogPrimaryBrush}"> <Grid TextBlock.Foreground="{DynamicResource DefaultFontColorBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!--标题--> <Border CornerRadius="4 4 0 0" Background="{DynamicResource DialogTitleBrush}" BorderThickness="0" TextBlock.Foreground="{DynamicResource DefaultFontColorBrush}"> <Grid Margin="0 10"> <TextBlock Text="{Binding Title,FallbackValue=量具失效追溯管理}" FontWeight="SemiBold" FontSize="14" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20 0 0 0"/> <Button Style="{StaticResource CloseButtonStyle}"/> </Grid> </Border> <!--表单--> <Grid Grid.Row="1" Margin="0 10"> <ScrollViewer VerticalScrollBarVisibility="Auto"> <!-- 允许垂直滚动 --> <UniformGrid Columns="1"> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[ToolCode],FallbackValue=ToolCode}" VerticalAlignment="Center" Text="{Binding SelectData.ToolCode}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[DeviceName],FallbackValue=DeviceName}" VerticalAlignment="Center" Text="{Binding SelectData.DeviceName}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[Manufacturer],FallbackValue=Manufacturer}" VerticalAlignment="Center" Text="{Binding SelectData.Manufacturer}"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[ModelSpec],FallbackValue=ModelSpec}" VerticalAlignment="Center" Text="{Binding SelectData.ModelSpec}"/> <hc:DateTimePicker hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[FailureDate],FallbackValue=FailureDate}" VerticalAlignment="Center" SelectedDateTime="{Binding SelectData.FailureDate}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[FailurePhenomenon],FallbackValue=FailurePhenomenon}" VerticalAlignment="Center" Text="{Binding SelectData.FailurePhenomenon}" /> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[IsInvolveProduct],FallbackValue=IsInvolveProduct}" VerticalAlignment="Center" Text="{Binding SelectData.IsInvolveProduct}" /> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[Remark],FallbackValue=Remark}" VerticalAlignment="Center" Text="{Binding SelectData.Remark}"/> <hc:Upload hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Title="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" FileType="*" MaxCount="5" UploadUrl="{Binding UploadUrl}" Files="{Binding SelectData.ProcessingRecords, Mode=TwoWay}" hc:InfoElement.Placeholder="{Binding Langs[UploadTip],FallbackValue=处理记录请自行上传}"/> </UniformGrid> </ScrollViewer> </Grid> <DockPanel Grid.Row="2" Margin="13 0"> <Button Margin="10" Width="130" Background="{DynamicResource AddBtnBrush}" Foreground="White" BorderBrush="{DynamicResource AddBtnBrush}" Content="{Binding Langs[Confirm]}" DockPanel.Dock="Right" HorizontalAlignment="Right" Command="{Binding SaveCommand}"/> <Button Margin="10" Width="130" Content="{Binding Langs[Cancel]}" DockPanel.Dock="Right" HorizontalAlignment="Right" Command="hc:ControlCommands.Close"/> </DockPanel> </Grid> </Border> </hc:DialogContainer> </UserControl> <UserControl x:Class="MES.Client.Tooling.UserControls.MeasuringFaliureTracing" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:control="clr-namespace:MES.Client.UICommon.Controls;assembly=MES.Client.UICommon" hc:Dialog.Token="{Binding DialogToken}" d:DataContext="{d:DesignInstance Type=usercontrols:MeasuringFaliureTracingViewModel,IsDesignTimeCreatable=True}" xmlns:enum="clr-namespace:MES.Client.Toolkit.Enums;assembly=MES.Client.Toolkit" xmlns:usercontrols="clr-namespace:MES.Client.Tooling.UserControls" xmlns:sync="http://schemas.syncfusion.com/wpf" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MES.Client.UICommon;component/Styles/CommStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <hc:DialogContainer> <Grid Background="{DynamicResource MESPrimaryBrush}"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" Margin="10"> <TextBlock Text="量具失效追溯管理" FontWeight="DemiBold" VerticalAlignment="Center" FontSize="16" Margin="21 0 0 0"/> <Border BorderThickness="1 0 0 0" BorderBrush="{DynamicResource MESBorderBrush}" Margin="20 0" Height="24"/> <control:IconButton Visibility="{Binding MenuID,Converter={StaticResource getPermissonToVisibilityConverter},ConverterParameter={x:Static enum:PermissonEnum.Add }}" IBForeground="{DynamicResource PaginationSelectedBrush}" Background="{DynamicResource AddBtnBrush}" StrText="{Binding Langs[Add]}" Icon="" BorderThickness="0" FontSize="14" Margin="0 0 10 0" Command="{Binding ModifyCommand}"/> </StackPanel> <hc:Card Grid.Row="1" Margin="10 0 10 10" BorderThickness="1"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <DockPanel TextBlock.FontSize="14"> <hc:TextBox Margin="13" hc:InfoElement.Title="{Binding Langs[ToolCode],FallbackValue=ToolCode}" Text="{Binding SearchData.ToolCode}" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" hc:InfoElement.TitlePlacement="Left" HorizontalAlignment="Left" Width="150"/> <hc:TextBox Margin="13" hc:InfoElement.Title="{Binding Langs[DeviceName],FallbackValue=DeviceName}" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" hc:InfoElement.TitlePlacement="Left" Width="150" Text="{Binding SearchData.DeviceName}"/> <hc:DateTimePicker Margin="13" SelectedDateTime ="{Binding SearchData.StartFailureDate}" Style="{StaticResource DateTimePickerPlus}" hc:InfoElement.Title="{Binding Langs[StartFailureDate],FallbackValue=StartFailureDate}" hc:InfoElement.TitlePlacement="Left" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}"/> <hc:DateTimePicker Margin="13" SelectedDateTime="{Binding SearchData.EndFailureDate}" Style="{StaticResource DateTimePickerPlus}" hc:InfoElement.Title="{Binding Langs[EndFailureDate],FallbackValue=EndFailureDate}" hc:InfoElement.TitlePlacement="Left" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}"/> <control:IconButton Visibility="{Binding MenuID,Converter={StaticResource getPermissonToVisibilityConverter},ConverterParameter={x:Static enum:PermissonEnum.Query }}" StrText="{Binding Langs[Search]}" Icon="" FontSize="14" HorizontalAlignment="Left" Margin="32 0 0 0" Command="{Binding SearchCommand}"/> </DockPanel> <control:MESSfDataGrid SelectedItems="{Binding SelectedItems,Mode=TwoWay}" SelectionMode="Extended" IsShowChooseBtn="True" MenuID="{Binding MenuID}" Token="{Binding DialogToken}" Margin="10 0 10 5" ItemsSource="{Binding DataList}" Grid.Row="1" Langs="{Binding Langs}" EditCommand="{Binding ModifyCommand}" DeleteCommand="{Binding DeleteCommand}" ImportCommand="{Binding SearchCommand}" SolTypeName="VENDOR" IsImport="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Import }}" IsDel="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Delete }}" IsEdit="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Modify }}" IsDetail="False"> <control:MESSfDataGrid.Columns> <sync:GridTextColumn MappingName="Id" HeaderText="{Binding Langs[Id],FallbackValue=Id}" IsHidden="True"/> <sync:GridTextColumn MappingName="ItemNo" HeaderText="{Binding Langs[ItemNo],FallbackValue=ItemNo}" IsHidden="True"/> <sync:GridTextColumn MappingName="ToolCode" HeaderText="{Binding Langs[ToolCode],FallbackValue=ToolCode}" IsHidden="False"/> <sync:GridTextColumn MappingName="DeviceName" HeaderText="{Binding Langs[DeviceName],FallbackValue=DeviceName}" IsHidden="False"/> <sync:GridTextColumn MappingName="Manufacturer" HeaderText="{Binding Langs[Manufacturer],FallbackValue=Manufacturer}" IsHidden="False"/> <sync:GridTextColumn MappingName="ModelSpec" HeaderText="{Binding Langs[ModelSpec],FallbackValue=ModelSpec}" IsHidden="False"/> <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="FailureDate" HeaderText="{Binding Langs[FailureDate],FallbackValue=FailureDate}" IsHidden="False"/> <sync:GridTextColumn MappingName="FailurePhenomenon" HeaderText="{Binding Langs[FailurePhenomenon],FallbackValue=FailurePhenomenon}" IsHidden="False"/> <sync:GridTextColumn MappingName="IsInvolveProduct" HeaderText="{Binding Langs[IsInvolveProduct],FallbackValue=IsInvolveProduct}" IsHidden="False"/> <!--失效产品处理记录--> <!-- 在现有列后追加 --> <sync:GridTextColumn MappingName="ProcessingRecords" HeaderText="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" IsHidden="False"/> <sync:GridTextColumn MappingName="Remark" HeaderText="{Binding Langs[Remark],FallbackValue=Remark}" IsHidden="False"/> <!-- <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="CreateTime" HeaderText="{Binding Langs[CreateTime],FallbackValue=CreateTime}" IsHidden="True"/> <sync:GridTextColumn MappingName="CreateUser" HeaderText="{Binding Langs[CreateUser],FallbackValue=CreateUser}" IsHidden="False"/> <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="UpdateTime" HeaderText="{Binding Langs[UpdateTime],FallbackValue=UpdateTime}" IsHidden="True"/> <sync:GridTextColumn MappingName="UpdateUser" HeaderText="{Binding Langs[UpdateUser],FallbackValue=UpdateUser}" IsHidden="True"/>--> </control:MESSfDataGrid.Columns> </control:MESSfDataGrid> <control:YLHPagination Margin="10 5" Grid.Row="2" PageIndex="{Binding PageIndex,Mode=TwoWay}" TotalCount="{Binding TotalCount}" PageSize="{Binding PageSize,Mode=TwoWay}" TotalPages="{Binding TotalPages,Mode=TwoWay}"/> </Grid> </hc:Card> </Grid> </hc:DialogContainer> </UserControl>修改里面的上传文件那块代码 <hc:Upload hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Title="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" FileType="*" MaxCount="5" UploadUrl="{Binding UploadUrl}" Files="{Binding SelectData.ProcessingRecords, Mode=TwoWay}" hc:InfoElement.Placeholder="{Binding Langs[UploadTip],FallbackValue=处理记录请自行上传}"/>using HandyControl.Tools.Extension; using MES.Client.Tooling.Models.MeasuringFaliureTracing; using MES.Client.Toolkit.Comm; using MES.Client.Toolkit.Enums; using MES.Client.Toolkit.HTTP; using MES.Client.UICommon.Controls; using MES.Common.Toolkit.Helper; using System; using System.Collections.Generic; using System.Text; using System.Windows.Controls; using System.Windows.Input; namespace MES.Client.Tooling.UserControls { /// <summary> /// ModifyMeasuringFaliureTracing.xaml 的交互逻辑 /// </summary> public partial class ModifyMeasuringFaliureTracing : UserControl { public ModifyMeasuringFaliureTracing(MeasuringFailureTracingModel masModel, Dictionary<string, string> langs, OperateStateEmun stateEmun) { InitializeComponent(); DataContext = new ModifyMeasuringFaliureTracingViewModel(masModel, langs, stateEmun); } } public class ModifyMeasuringFaliureTracingViewModel : ViewModelBase, IDialogResultable<bool> { private MeasuringFailureTracingModel selectData = new(); private Dictionary<string, string> langs = new(); private string title = string.Empty; public string UploadUrl { get; set; } = "api/Tooling/MeasuringFaliureTracing/UnLoad"; public string ProcessingRecords { get; set; } = string.Empty; public MeasuringFailureTracingModel SelectData { get => selectData; set { selectData = value; PCEH(); } } public Dictionary<string, string> Langs { get => langs; set { langs = value; PCEH(); } } public bool Result { get; set; } = false; public Action? CloseAction { get; set; } /// <summary> /// 保存 /// </summary> public ICommand SaveCommand { get; set; } public string Title { get => title; set { title = value; PCEH(); } } /// <summary> /// 操作类型 /// </summary> public OperateStateEmun StateEmun { get; set; } public ModifyMeasuringFaliureTracingViewModel(MeasuringFailureTracingModel itemtModel, Dictionary<string, string> langs, OperateStateEmun stateEmun) { StateEmun = stateEmun; SelectData = itemtModel.Clone(); //if (stateEmun == OperateStateEmun.Add) //{ // SelectData.LastAnalysisDate ??= DateTime.Today.AddDays(-30); // SelectData.NextRemindDate ??= DateTime.Today.AddDays(30); //} Langs = langs; Initialize(); SaveCommand = new CommandBase(async l => { if (!Check()) return; string ret = string.Empty; int toolCodeLength = getStringLength(SelectData.ToolCode); if (toolCodeLength > 40) { Message.Warnning(Langs.LangGetValue("ToolCode") + Langs.LangGetValue("CharacterLengthIsLong")); return; } int deviceNameLength = getStringLength(SelectData.DeviceName); if (deviceNameLength > 40) { Message.Warnning(Langs.LangGetValue("DeviceName") + Langs.LangGetValue("CharacterLengthIsLong")); return; } if (!string.IsNullOrEmpty(SelectData.Manufacturer)) { int manufacturerLength = getStringLength(SelectData.Manufacturer); if (manufacturerLength > 40) { Message.Warnning(Langs.LangGetValue("Manufacturer") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.ModelSpec)) { int modelSpecLength = getStringLength(SelectData.ModelSpec); if (modelSpecLength > 100) { Message.Warnning(Langs.LangGetValue("ModelSpec") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.FailurePhenomenon)) { int failurePhenomenonLength = getStringLength(SelectData.FailurePhenomenon); if (failurePhenomenonLength > 200) { Message.Warnning(Langs.LangGetValue("FailurePhenomenon") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.IsInvolveProduct)) { int isInvolveProductLength = getStringLength(SelectData.IsInvolveProduct); if (isInvolveProductLength > 1) { Message.Warnning(Langs.LangGetValue("IsInvolveProduct") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.Remark)) { int remarkLength = getStringLength(SelectData.Remark); if (remarkLength > 300) { Message.Warnning(Langs.LangGetValue("Remark") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } ret = await APIHelper.PostSendAsync(ApiRoutes.SaveMeasuringFaliureTracing, SelectData); if (ret is not null) { string successMsg = StateEmun == OperateStateEmun.Add ? Langs.LangGetValue("添加成功") : Langs.LangGetValue("修改成功"); MESGrowl.MESSuccess(successMsg); Result = true; CloseAction?.Invoke(); } }); } public int getStringLength(string str) { if (str.Equals(string.Empty)) return 0; int strlen = 0; ASCIIEncoding strData = new ASCIIEncoding(); // 将字符串转换为ASCII编码的字节数字 byte[] strBytes = strData.GetBytes(str); for (int i = 0; i <= strBytes.Length - 1; i++) { if (strBytes[i] == 63) // 中文都将编码为ASCII编码63,即"?"号 strlen += 2; strlen++; } return strlen; } private bool Check() { if (string.IsNullOrEmpty(SelectData.ToolCode)) { Message.Warnning(Langs.LangGetValue("ToolCode") + Langs.LangGetValue("IsInvalid")); return false; } // 检查DeviceName(设备名称)是否为空 if (string.IsNullOrEmpty(SelectData.DeviceName)) { Message.Warnning(Langs.LangGetValue("DeviceName") + Langs.LangGetValue("IsNull")); return false; } //// 检查LastAnalysisDate(上次分析日期)是否有值 //if (!SelectData.LastAnalysisDate.HasValue) //{ // Message.Warnning(Langs.LangGetValue("LastAnalysisDate") + Langs.LangGetValue("IsNull")); // return false; //} // 检查TestItem(测试项目)是否为空 if (!SelectData.FailureDate.HasValue) { Message.Warnning(Langs.LangGetValue("FailureDate") + Langs.LangGetValue("IsNull")); return false; } return true; } private void Initialize() { switch (StateEmun) { case OperateStateEmun.Add: Title = Langs.LangGetValue("新增"); break; case OperateStateEmun.Edit: Title = Langs.LangGetValue("修改"); break; case OperateStateEmun.Detail: break; default: break; } } } }using HandyControl.Controls; using HandyControl.Tools.Extension; using MES.Client.Models.Dtos; using MES.Client.Models.Models; using MES.Client.Tooling.Dto.MeasuringFaliureTracing; using MES.Client.Tooling.Models.MeasuringFaliureTracing; using MES.Client.Toolkit.Comm; using MES.Client.Toolkit.Enums; using MES.Client.Toolkit.HTTP; using MES.Client.UICommon.Comm; using MES.Client.UICommon.Controls; using MES.Client.UICommon.Helper; using MES.Common.Toolkit.Helper; using Microsoft.Win32; using Newtonsoft.Json; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; namespace MES.Client.Tooling.UserControls { /// <summary> /// MeasuringFaliureTracing.xaml 的交互逻辑 /// </summary> public partial class MeasuringFaliureTracing : UserControl { private MeasuringFaliureTracingViewModel model; public MeasuringFaliureTracing() { InitializeComponent(); DataContext = model = new MeasuringFaliureTracingViewModel(); Loaded += MeasuringFaliureTracing_Loaded; } //} private void MeasuringFaliureTracing_Loaded(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(model.MenuID)) return; model.MenuID = string.IsNullOrEmpty(Uid) ? "" : Uid; } } public class MeasuringFaliureTracingViewModel : CommonListViewModel<MeasuringFaliureTracingInDto, MeasuringFailureTracingModel> { private MeasuringFailureTracingModel selectedModel = new(); /// <summary> /// 选中的MSA测量记录 /// </summary> public MeasuringFailureTracingModel SelectedModel { get => selectedModel; set { selectedModel = value; PCEH(); } } //private ObservableCollection<MeasuringFailureTracingModel> selectedItems = new(); //public ObservableCollection<MeasuringFailureTracingModel> SelectedItems //{ // get => selectedItems; // set // { // SetProperty(ref selectedItems, value); // SelectedIds = value.Select(item => item.Id).ToList(); // } //} //// 2. 选中的 ID 列表(传给后端) //private List<string> selectedIds = new(); //public List<string> SelectedIds //{ // get => selectedIds; // set => SetProperty(ref selectedIds, value); //} /// <summary> /// 查询条件 /// </summary> private MeasuringFaliureTracingInDto searchData = new(); public MeasuringFaliureTracingInDto SearchData { get => searchData; set { searchData = value; PCEH(); } } public MeasuringFaliureTracingViewModel() { PageIndex = 1; PageSize = 20; /// <summary> /// 查询 /// </summary> SearchCommand = new CommandBase(async l => { var loading = Dialog.Show(new UICommon.Controls.LoadingCircle(), DialogToken); try { SearchParameter = new MeasuringFaliureTracingInDto { Id = SearchData.Id, ToolCode = SearchData.ToolCode, FailureDate = SearchData.FailureDate, DeviceName = SearchData.DeviceName }; SearchParameter.PageIndex = PageIndex; SearchParameter.PageSize = PageSize; SearchParameter.StartFailureDate = SearchData.StartFailureDate; SearchParameter.EndFailureDate = SearchData.EndFailureDate; var ret = await APIHelper.PostSendDtoAsync<PaginationData>( ApiRoutes.GetMeasuringFaliureTracingList, SearchParameter ); if (ret != null) { TotalCount = ret.TotalCount; TotalPages = ret.TotalPages; var dataListJson = ret?.DataList?.ToJson() ?? "[]"; DataList = JsonConvert.DeserializeObject<ObservableCollection<MeasuringFailureTracingModel>>(dataListJson) ?? new(); if (l != null && !string.IsNullOrEmpty(l.ToString())) SelectedItem = DataList.FirstOrDefault(f => f.ToolCode == l.ToString()); } } catch (Exception ex) { Message.Error($"查询失败:{ex.Message}"); } finally { loading.Close(); } }); ModifyCommand = new CommandBase(async l => { bool flag = false; if (l != null) { flag = await Dialog.Show(new ModifyMeasuringFaliureTracing((MeasuringFailureTracingModel)l, Langs, OperateStateEmun.Edit), DialogToken).GetResultAsync<bool>(); } else { flag = await Dialog.Show(new ModifyMeasuringFaliureTracing(new MeasuringFailureTracingModel(), Langs, OperateStateEmun.Add), DialogToken).GetResultAsync<bool>(); } if (flag) { SearchCommand?.Execute(null); } }); DeleteCommand = new CommandBase(async l => { if (l is MeasuringFailureTracingModel deleteItem) { if (Message.Ask(Langs.LangGetValue("DeleteConfirm"))) { List<IdInDto> inDto = new(); inDto.Add(new IdInDto { Id = deleteItem.Id }); var ret = await APIHelper.PostSendAsync(ApiRoutes.DeleteMeasuringFaliureTracing, inDto); if (ret != null) { DataList.Remove(deleteItem); TotalCount -= 1; } } } }); ExportCommand = new CommandBase(async l => { try { var exportParam = new MeasuringFaliureTracingInDto { ToolCode = SearchData.ToolCode, DeviceName = SearchData.DeviceName, StartFailureDate = SearchData.StartFailureDate, EndFailureDate = SearchData.EndFailureDate, IsExport = true }; var exportData = await APIHelper.PostSendDtoAsync<List<MeasuringFailureTracingModel>>( ApiRoutes.ExportMeasuringFaliureTracingPageData, exportParam ); if (exportData == null || !exportData.Any()) { Message.Warnning(Langs.LangGetValue("NoDataToExport")); return; } DataTable ConvertToDataTable<T>(IEnumerable<T> dataList) { var dt = new DataTable(); if (dataList == null || !dataList.Any()) return dt; var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in props) { dt.Columns.Add(prop.Name, typeof(string)); } foreach (var item in dataList) { var row = dt.NewRow(); foreach (var prop in props) { object value = prop.GetValue(item); if (value == null) { value = string.Empty; } else if (value is DateTime date) { value = date.ToString("yyyy-MM-dd HH:mm:ss"); } else if (value is IEnumerable<string> stringList) { value = string.Join(", ", stringList); } else { value = value.ToString(); } row[prop.Name] = value; } dt.Rows.Add(row); } return dt; } var dataTable = ConvertToDataTable(exportData); bool DataTableToExcel(DataTable dt, string filePath) { try { IWorkbook workbook = filePath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) ? (IWorkbook)new XSSFWorkbook() : new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet("ExportData"); int rowIndex = 0; var headerRow = sheet.CreateRow(rowIndex++); for (int i = 0; i < dt.Columns.Count; i++) { headerRow.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName); } foreach (DataRow dataRow in dt.Rows) { var row = sheet.CreateRow(rowIndex++); for (int i = 0; i < dt.Columns.Count; i++) { object cellValue = dataRow[i] is DBNull ? string.Empty : dataRow[i]; if (cellValue is DateTime date) { row.CreateCell(i).SetCellValue(date.ToString("yyyy-MM-dd HH:mm:ss")); } else { row.CreateCell(i).SetCellValue(cellValue?.ToString()); } } } for (int i = 0; i < dt.Columns.Count; i++) { sheet.AutoSizeColumn(i); } using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { workbook.Write(fs,false); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Excel导出失败: {ex.Message}"); return false; } } var saveDialog = new SaveFileDialog { Title = Langs.LangGetValue("SelectExportPath"), Filter = "Excel文件|*.xls;*.xlsx", FileName = $"{DateTime.Now:yyyyMMdd}_MeasuringFailureExport.xlsx", RestoreDirectory = true, DefaultExt = "xlsx", OverwritePrompt = true }; if (saveDialog.ShowDialog() == true) { bool exportSuccess = DataTableToExcel(dataTable, saveDialog.FileName); if (exportSuccess) { Message.Info(Langs.LangGetValue("ExportSuccess")); } else { Message.Error(Langs.LangGetValue("ExportFailed_FileWrite")); } } } catch (Exception ex) { Message.Error($"{Langs.LangGetValue("ExportFailed")}: {ex.Message}"); } }); } public override void CommViewModelLoad() { SearchCommand?.Execute(null); } } }
08-21
<Grid x:Class="GUI.Views.SelectedSubViewModels.Recipe.RecipeParameter.StepOptionView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:enum="clr-namespace:GUI.Resource.StaticResource.ETC" xmlns:enumShared="clr-namespace:SharedMemory;assembly=SharedMemory" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mcnv="clr-namespace:GUI.Resource.StaticResource.Converter.MultiValue" x:Name="root" Margin="0,5,0,5" d:DesignHeight="500" d:DesignWidth="200" Background="{StaticResource BackgroundBrush}" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl, AncestorLevel=1}, Path=DataContext}" mc:Ignorable="d"> <Grid.Resources> <mcnv:AddDrainConverter x:Key="AddDrain" /> </Grid.Resources> <Grid.RowDefinitions> <RowDefinition Height="30" /> <RowDefinition Height="30" /> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Border Background="{StaticResource AKGradient}"> <ComboBox x:Name="StepNameComboBox" Background="Transparent" BorderThickness="0" IsHitTestVisible="False" ItemsSource="{Binding Source={hc:EnumBindingSource {x:Type enumShared:StepName}}}" SelectedItem="{Binding StepName, Mode=TwoWay}"> <hc:Interaction.Triggers> <hc:EventTrigger EventName="DropDownClosed"> <hc:EventToCommand Command="{Binding ElementName=root, Path=Tag.ClosedStepNameCommand}" CommandParameter="{Binding ElementName=StepNameComboBox, Path=SelectionBoxItem}" /> </hc:EventTrigger> <hc:EventTrigger EventName="DropDownOpened"> <hc:EventToCommand Command="{Binding ElementName=root, Path=Tag.OpenedStepNameCommand}" CommandParameter="{Binding ElementName=StepNameComboBox, Path=SelectionBoxItem}" /> </hc:EventTrigger> </hc:Interaction.Triggers> </ComboBox> </Border> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="ShildItems"> <hc:Shield Margin="0,0,5,0" Subject="{Binding}"> <hc:Shield.Resources> <mcnv:CupLevelConverter x:Key="CupConvert" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.CupDeleteCommand}" Cursor="Hand"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource CupConvert}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Cup Levels" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddCupLevelEditorOpenCommand}" CommandParameter="{Binding StepName, Mode=OneWay}" Cursor="Hand"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ItemsControl Grid.Column="2" ItemTemplate="{DynamicResource ShildItems}" ItemsPanel="{StaticResource StackPanel}" ItemsSource="{Binding EnabledCupLevels}" /> </Grid> <Grid Grid.Row="2" Background="{StaticResource DarkMaskBrush}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="EnabledDrainShildItem"> <hc:Shield Margin="0,0,5,5" Subject="{Binding Converter={StaticResource IntToDrainValve}}"> <hc:Shield.Resources> <mcnv:DrainConverter x:Key="DrainConvert" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.DrainDeleteCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.Drain}"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource DrainConvert}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Drain V/V" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddDrainEditorOpenCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.Drain}"> <Button.CommandParameter> <MultiBinding Converter="{StaticResource AddDrain}"> <Binding Path="StepName" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> </MultiBinding> </Button.CommandParameter> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ScrollViewer Grid.Column="2" HorizontalScrollBarVisibility="Auto"> <ItemsControl ItemTemplate="{DynamicResource EnabledDrainShildItem}" ItemsPanel="{StaticResource ItemPanelStackVertical}" ItemsSource="{Binding EnabledDrainValves}" /> </ScrollViewer> </Grid> <Grid Grid.Row="3"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="EnabledDrainShildItem"> <hc:Shield Margin="0,0,5,5" Subject="{Binding Converter={StaticResource IntToDrainValve}}"> <hc:Shield.Resources> <mcnv:DrainConverter x:Key="DrainConvert" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.DrainDeleteCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.PreDrain}"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource DrainConvert}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Pre Drain V/V" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddDrainEditorOpenCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.PreDrain}"> <Button.CommandParameter> <MultiBinding Converter="{StaticResource AddDrain}"> <Binding Path="StepName" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> </MultiBinding> </Button.CommandParameter> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ScrollViewer Grid.Column="2"> <ItemsControl ItemTemplate="{DynamicResource EnabledDrainShildItem}" ItemsPanel="{StaticResource ItemPanelStackVertical}" ItemsSource="{Binding EnabledPreDrainValves}" /> </ScrollViewer> </Grid> <Grid Grid.Row="4" Background="{StaticResource DarkMaskBrush}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="EnabledDrainShildItem"> <hc:Shield Margin="0,0,5,5" Subject="{Binding Converter={StaticResource IntToDrainValve}}"> <hc:Shield.Resources> <mcnv:DrainConverter x:Key="DrainConvert" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.DrainDeleteCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.PostDrain}"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource DrainConvert}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Post Drain V/V" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddDrainEditorOpenCommand}" Cursor="Hand" Tag="{x:Static enum:EDrainKind.PostDrain}"> <Button.CommandParameter> <MultiBinding Converter="{StaticResource AddDrain}"> <Binding Path="StepName" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> </MultiBinding> </Button.CommandParameter> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ScrollViewer Grid.Column="2"> <ItemsControl ItemTemplate="{DynamicResource EnabledDrainShildItem}" ItemsPanel="{StaticResource ItemPanelStackVertical}" ItemsSource="{Binding EnabledPostDrainValves}" /> </ScrollViewer> </Grid> <Grid Grid.Row="5"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="EnabledDrainShildItem"> <hc:Shield Margin="0,0,5,5" Subject="{Binding}"> <hc:Shield.Resources> <mcnv:BackFlowConverter x:Key="BackFlowConverter" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.BackFlowDeleteCommand}" Cursor="Hand"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource BackFlowConverter}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Back Flow" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddBackFlowEditorOpenCommand}" Cursor="Hand" CommandParameter="{Binding StepName, Mode=OneWay}"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ScrollViewer Grid.Column="2"> <ItemsControl ItemTemplate="{DynamicResource EnabledDrainShildItem}" ItemsPanel="{StaticResource ItemPanelStackVertical}" ItemsSource="{Binding EnabledBackFlows}" /> </ScrollViewer> </Grid> <Grid Grid.Row="6"> <Grid.ColumnDefinitions> <ColumnDefinition Width="70" /> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.Resources> <DataTemplate x:Key="EnabledUpDowmItem"> <hc:Shield Margin="0,0,5,5" Subject="{Binding}"> <hc:Shield.Resources> <mcnv:BackFlowConverter x:Key="BackFlowConverter" /> </hc:Shield.Resources> <hc:Shield.Status> <Button Margin="0" Padding="0" Background="Transparent" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.BackFlowDeleteCommand}" Cursor="Hand"> <Button.Content> <TextBlock FontSize="10" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" /> </Button.Content> <Button.CommandParameter> <MultiBinding Converter="{StaticResource BackFlowConverter}"> <Binding ElementName="StepNameComboBox" Path="SelectedItem" /> <Binding /> </MultiBinding> </Button.CommandParameter> </Button> </hc:Shield.Status> </hc:Shield> </DataTemplate> <ItemsPanelTemplate x:Key="StackPanel"> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </Grid.Resources> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="DemiBold" Text="Enabled Up Down" TextAlignment="Center" TextWrapping="Wrap" /> <Button Grid.Column="1" Width="20" Height="20" Margin="0" Padding="0" Background="{StaticResource AkrionBlue}" BorderThickness="0" Command="{Binding ElementName=root, Path=Tag.AddBackFlowEditorOpenCommand}" Cursor="Hand" CommandParameter="{Binding StepName, Mode=OneWay}"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10" FontWeight="DemiBold" Foreground="White" Style="{StaticResource MDL2SymbolText}" Text="" TextAlignment="Center" TextWrapping="Wrap" /> </Button> <ScrollViewer Grid.Column="2"> <ItemsControl ItemTemplate="{DynamicResource EnabledUpDowmItem}" ItemsPanel="{StaticResource ItemPanelStackVertical}" ItemsSource="{Binding EnabledBackFlows}" /> </ScrollViewer> </Grid> </Grid> 完整的这个StepOptionView是这样的,能整体帮我解释吗
09-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值