• WPF开发经验


    UpdateSourceTrigger
    0.在一个项目中在用到绑定的时候一直有一个问题,虽然设置了Mode=TwoWay,界面的值修改了,但是后天绑定的值没有变化。最终发现了问题,在于UpdateSourceTrigger属性的使用,通过这个属性指定什么时刻去通知源数据改变值。默认是失去焦点触发,当然也可以根据程序需要,更改触发条件。
    例如:控件属性="{Binding SettingMarkContent,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
    Binding Mode 
    oneWay:使用 OneWay 绑定时,每当源发生变化,数据就会从源流向目标。

    OneTime: 绑定也会将数据从源发送到目标;但是,仅当启动了应用程序或 DataContext 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。

    OneWayToSource: 绑定会将数据从目标发送到源。

    TwoWay: 绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。

    Default: binding的模式根据实际情况来定,如果是可编辑的就是TwoWay,只读的就是OneWay.

    上面的例子不设Mode时,默认的就是Default.

    1.应用程序中正在运行线程时,System.Windows.Application.Current.Shutdown();关闭应用程序有异常,使用下边方法。
    close的时候子线程还处于active状态吧。。完全退出用
    System.Environment.Exit(System.Environment.ExitCode);
    2.托盘窗口

    this.notifyIcon = new NotifyIcon();
                this.notifyIcon.BalloonTipText = "running in background";
                this.notifyIcon.ShowBalloonTip(2000);
                this.notifyIcon.Text = "running in background";
                this.notifyIcon.Icon = new System.Drawing.Icon(DirectoryManager.AppPath + "\UpDownload_48x48.ico");
                this.notifyIcon.Visible = true;
                this.Icon = new BitmapImage(new Uri(@"UpDownload_48x48.ico", UriKind.Relative));
                //打开菜单项
                System.Windows.Forms.MenuItem open = new System.Windows.Forms.MenuItem("Open");
                open.Click += new EventHandler(Show);
                //退出菜单项
                System.Windows.Forms.MenuItem exit = new System.Windows.Forms.MenuItem("Exit");
                exit.Click += new EventHandler(Close);
                //关联托盘控件
                System.Windows.Forms.MenuItem[] childen = new System.Windows.Forms.MenuItem[] { open, exit };
                notifyIcon.ContextMenu = new System.Windows.Forms.ContextMenu(childen);

                this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler((o, e) =>
                {
                    if (e.Button == MouseButtons.Left) this.Show(o, e);
                });

    private NotifyIcon notifyIcon;
            private void Show(object sender, EventArgs e)
            {
                this.Visibility = System.Windows.Visibility.Visible;
                this.ShowInTaskbar = true;
                this.Activate();
            }

            private void Hide(object sender, EventArgs e)
            {
                this.ShowInTaskbar = false;
                this.Visibility = System.Windows.Visibility.Hidden;
            }

            private void Close(object sender, EventArgs e)
            {
                System.Environment.Exit(System.Environment.ExitCode); 
                //System.Windows.Application.Current.Shutdown();
            }

     private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                    e.Cancel = true;
                    Hide();

            }

    3.判断应用程序是否开启状态

    //获取欲启动进程名
                string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
                ////获取版本号
                //CommonData.VersionNumber = Application.ProductVersion;
                //检查进程是否已经启动,已经启动则显示报错信息退出程序。
                if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
                {

                    MessageBox.Show("MetadataSync running in background!", "Message", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    Application.Current.Shutdown();
                    return;
                }

    4.更新app.config的AppSettings

    string key = "ScheduleLastUpload", value = DateTime.Now.ToString();
                        Configuration conf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                        bool hasSetKey = false;
                        foreach (string item in conf.AppSettings.Settings.AllKeys)
                        {
                            if (item == key)
                            {
                                conf.AppSettings.Settings[item].Value = value;

                                hasSetKey = true;
                            }
                        }
                        if (hasSetKey == false)
                        {
                            conf.AppSettings.Settings.Add(key, value);
                        }
                        ConfigurationManager.AppSettings.Set(key, value);
                        conf.Save();

    5、给TextBlock加ToolTip,绑定自身

     <TextBlock ToolTip="{Binding RelativeSource={RelativeSource Self},Path=Text}"
    Text="{Binding Path=Patientmain,
    Converter={StaticResource fullNameConverter}}"
    TextTrimming="CharacterEllipsis">
    </TextBlock>
    6.Margin与Padding

      Margin(外边距),指的是元素周围的距离,决定了元素周围留下的空白大小;Padding(内边距),指的是元素边界与其内容之间的距离。做过网页设计、用过CSS的同学对margin和padding属性肯定不陌生,但也有所区别。WPF中的Margin值可以为一个数字、一对数字和四个数字。

      一个数字代表四周距离相同,为指定值。一对数字时,第一个数字表示左侧和右侧距离相同,为指定值;第二个数字表示顶部和底部距离相同,为指定值。(与CSS中顺序不同)。四个数字,分别表示左侧、顶部、右侧、底部距离,该顺序与CSS不同。

      CSS中margin和padding属性顺序是:两个数字对应左右、上下;四个数字对应上、右、下、左;

    区别HTML DOM margin属性

    定义和用法

    margin属性设置元素的外边距。

    该属性可使用1到4个值:

    如果规定一个值,比如div{margin:50px}-所有的外边距都是50px

    如果规定两个值,比如div{margin:50px10px}-上下外边距是50px,左右外边距是10px。

    如果规定三个值,比如div{margin:50px10px20px}-上外边距是50px,而左右外边距是10px,下外边距是20px。

    如果规定四个值,比如div{margin:50px10px20px30px}-上外边距是50px,右外边距是10px,下外边距是20px,左外边距是30px。

    计算:

    继存INotifyPropertyChanged

    public class NotificationObject : INotifyPropertyChanged
    {

    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string proname)
    {
    if (this.PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(proname));
    }
    }

    public class TestDemo1CalcuNumber : NotificationObject
    {
    private int _num1;
    public int Num1
    {
    get { return _num1; }
    set
    {
    _num1 = value;
    RaisePropertyChanged("Num1");
    }
    }

    }

    然后在VIEWMODEL中可能定义绑定事件,先执行属性中的Set属性RaisePropertyChanged("Num1");,然后执行public void RaisePropertyChanged(string proname),然后执行CalcuNumber_PropertyChanged,最后执行属性中的get属性。

    CalcuNumber.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(CalcuNumber_PropertyChanged);

    void CalcuNumber_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
    if (e.PropertyName == "Num1" || e.PropertyName == "Num2")
    {
    CalcuNumber.Result = CalcuNumber.Num1 + CalcuNumber.Num2;
    }
    }

    弹出屏外层灰色背景半透明背景

    <Grid x:Name="GrdGraphicalResults" Grid.RowSpan="3" Visibility="Collapsed">
    <Grid.Background>
    <SolidColorBrush Color="Black" Opacity="0.6"></SolidColorBrush>
    </Grid.Background>
    <Border Background="White">

    ....

    </Border>

    </Grid>

    style使用converter

    <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource DataGridRowStyle}">

    <Setter Property="Visibility" Value="{Binding IsDeleted,Converter={StaticResource BooleanToVisibilityInverseConverter}}" />
    </Style>

    RelativeSource绑定

    在WPF绑定的时候,指定绑定源时,有一种办法是使用RelativeSource。

    这种办法的意思是指当前元素和绑定源的位置关系。

    第一种关系: Self

    举一个最简单的例子:在一个StackPanel中,有一个TextBlock。

    1
    2
    <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
                     Background="Red" Width="80" Height="{Binding RelativeSource={RelativeSource Self},Path=Width}">MultiBinding Sample</TextBlock>

    如果想让textbox的width和height相同,通过设置属性Height="{Binding RelativeSource={RelativeSource Self},Path=Width}" 就可以实现。

    第二种关系:TemplatedParent

    例如为一个Button写一个样式,修改Button为椭圆型。同时需要椭圆的背景色和Button的背景色相同。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Green"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Grid>
                                <Ellipse>
                                    <Ellipse.Fill>
                                        <SolidColorBrush Color="{Binding Path=Background.Color,RelativeSource={RelativeSource TemplatedParent}}"/>
                                    </Ellipse.Fill>
                                </Ellipse>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

     在这个例子中 TemplateParent就是指的Button

    第三种关系:AncestorType

    指定绑定源为某个父元素

    复制代码
    <Grid>
    
              <Label Background = {Binding Path=Background, RelativeSource={RelativeSource AncestorType={x:Type Grid}}}/>
    
         </Grid>
    复制代码

    这个例子中Label的背景色和Grid的背景色一样。

    本事例是打开win8系统触摸键盘。

    private void OpenKeyBoardHandler()
    {
    ProcessStartInfo info = new ProcessStartInfo();
    info.FileName = @"C:Program FilesCommon Filesmicrosoft sharedinkTabTip.exe";
    info.Arguments = "";
    info.WindowStyle = ProcessWindowStyle.Hidden;
    Process pro = Process.Start(info);
    pro.WaitForExit();
    this.Close();
    }

    7.mvvm send key

    xaml:

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    <textbox text="{Binding text,mode=TwoWay,UpdatesourceTrigger=Propertychanged}">
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyUp">
          <ei:CallMethodAction TargetObject="{Binding}" MethodName="SeachKeyUpCommand"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    </textbox>
    viewmodel:

    public void SeachKeyUpCommand(object sender, System.Window.Input.KeyEventArgs e)
    {
      if(e.Key.Equals(System.Window.Input.Key.Enter))
      {
        //TODO search
      }
    }

    8.ScrollViewer阻断内部滚动

    private void SvrGroupDetail_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
    try
    {
    var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
    eventArg.RoutedEvent = MouseWheelEvent;
    eventArg.Source = sender;
    ScrollViewer scrollViewer = (ScrollViewer)sender;
    scrollViewer.RaiseEvent(eventArg);
    }
    catch (Exception ex)
    {
    OneLog.E(ex);
    ConfirmDialogState.ShowMessage(ex.Message);
    }
    }
    }

    9.监听

    C# FileSystemWatcher 在监控文件夹和文件时的用法

    https://blog.csdn.net/ab17171313/article/details/82423630

    
    
  • 相关阅读:
    android:screenOrientation属性详解
    Android APP混淆后,友盟分享功能出错的解决办法
    Android 混淆出错各种解决办法
    转一个工作三年的Android开发人员的思考
    Android 工程混淆后无法找到自定义控件类的解决方案
    Android Studio无法启动的解决方案 cannot start or open
    niz键盘windows键失效的解决办法:恢复出厂设置
    决策树学习资料
    人工智能行业发展趋势
    转:深度聚类算法研究综述(A Survey of Deep Clustering Algorithms)
  • 原文地址:https://www.cnblogs.com/zhaowei303/p/4255532.html
Copyright © 2020-2023  润新知