精华内容
下载资源
问答
  • wpf+stylet

    2018-08-17 09:53:03
    利用第三方开源库Stylet开发WPF的一个小demo,不得不说利用Stylet可以减少MVVM模式下很多的代码,基于.net framework4.5,可直接运行
  • WPF绑定 一、背景 晚上吃过饭,就溜达,恰好就看到大神同事正在新建一个WPF项目。就跟他聊个天,我说我对WPF也算了解,也能依葫芦画瓢往里搞控件搞数据,我觉得我最不会的地方是新建一个项目后,要数据绑定,绑定...

    WPF绑定

    一、背景
    晚上吃过饭,就溜达,恰好就看到大神同事正在新建一个WPF项目。就跟他聊个天,我说我对WPF也算了解,也能依葫芦画瓢往里搞控件搞数据,我觉得我最不会的地方是新建一个项目后,要数据绑定,绑定最开始是怎么形成的,怎么定义的,Xaml怎么找到这个类的?
    大神同事呵呵一笑。这你都不会?于是开始给我直播创建新的项目。
    由于我是菜鸟,每当这个时候就网上搜,或者找以前的项目依葫芦画瓢,虽说都能解决问题满足需求,但总没有系统的学习过,总之很狼狈。于是看大神操作了一波,除绑定外,还学习了公共控件ContentControl的使用。怕以后用到的时候忘记了,写这篇当作记笔记了。

    二、环境
    本人使用 VS2019 ; .NET Framework 4.7.2

    三、过程
    1.新建WPF项目。然后界面上分分栏,随便搞点东西。大概就这样

    在这里插入图片描述
    2.关键的一步,添加引用。管理Nuget包,添加这些东西:
    在这里插入图片描述

    3.刚刚添加的Stylet的作用就是把View与ViewModel进行绑定,而绑定的方法,不需要写什么代码,关键之处在于命名。View的命名一定是XXXXView,与之相应的ViewModel一定要是XXXXViewModel。例如我这里把MainWindow重命名位MainView,且要新建一个MainViewModel作为他绑定的类。(建议新建window,改名容易出现各种错误)
    添加nuget包时,会出现一个pages文件夹,是一个示例,Xmal中的s引用需要复制到自己的view中。还有一个Bootstarpper类。这个类是决定启动文件的。
    在这里插入图片描述
    在这里插入图片描述
    4.进行绑定
    MainViewModel中继承 Screen类。 Screen是Sytlet中的类,作用就是根据名字找到View并进行绑定。
    在这里插入图片描述
    然后对刚刚建立的TextBox啊,Button啊,绑定试试。代码如下:

     public class MainViewModel : Screen
        {
            public string Word { get; set; }
    
            public string Figure { get; set; }
    
            public void Trans()
            {
                var fig = int.Parse(Figure);
                var w = "";
                switch (fig)
                {
                    case 1:
                        w = "一";
                        break;
                    case 2:
                        w = "二";
                        break;
                    case 3:
                        w = "三";
                        break;
                }
    
                Word = w;
            }
        }
    

    xaml代码:

    <Window x:Class="BindingTest.MainView"
            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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:BindingTest"
            xmlns:s="https://github.com/canton7/Stylet"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="3*"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
    
            <StackPanel Grid.Row="0" Orientation="Horizontal">
                <Label Content="数字:"  FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <TextBox Text="{Binding Figure}" Width="50"  FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <Label Content="文字:" Margin="50 0 0 0"  FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <TextBox Text="{Binding Word}" Width="50"  FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <Button Content="测试" Command="{s:Action Trans}" Margin="80 0 0 0" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </StackPanel>
    
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Row="2">
                <Label Content="Hello World!" VerticalAlignment="Center" FontSize="40"/>
            </StackPanel>
        </Grid>
    </Window>
    

    5.进行测试
    输入数字2,点击测试按钮。出现了“二”。 测试成功
    在这里插入图片描述
    6.结语
    先写这些。要下班了。
    中间那部分留着下次写contentCortol再用。
    本人菜鸟,可能有写的不对或者遗漏的地方。有什么问题欢迎交流。

    展开全文
  • stylet MVVM 是一个短小精悍的MVVM框架,做了个实例mahapp做的UI,可以参考学习一下
  • Stylet 数据的绑定 s:View.Model s:View.Model是在xaml中通过绑定BViewModel从而直接获取BView,并获取绑定在BView中数据的方式, 值得注意的是需要在使用BView的AView中的用法,并且在AViewModel中进行BViewModel的...

    Stylet

    数据的绑定

    s:View.Model

    s:View.Model是在xaml中通过绑定BViewModel从而直接获取BView,并获取绑定在BView中数据的方式,
    值得注意的是需要在使用BView的AView中的用法,并且在AViewModel中进行BViewModel的实例化,这样才能寻找到BView并进行数据绑定。
    示例

    <!-AView -->
    xmlns:s="clr-namespace:Stylet;assembly=Stylet"
    <Grid>
    	<ContentContrl s:View.Model="{Binding BViewModel}">
    </Grid>
    
    //AViewModel
    private BViewModel _bViewModel;
    public BViewModel BviewModel
    {
    	get=>_bViewModel;
    	set
    	{
    		_bBiewModel=value;
    		PropertyChanged(nameof(BViewModel));//通知界面属性变化
    	}
    }
    
    展开全文
  • Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴了其中的很多概念, 同时精简了一些部分, 如只...

    Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家.

    Stylet是受Caliburn Micro项目的启发, 所以借鉴了其中的很多概念, 同时精简了一些部分, 如只支持MVVM, WPF和.NET 4.5(Silverlight和Xamarin不受支持), 所以Style本身很小巧, DLL才140KB左右.

    虽然身材小,但相比知名的MVVM框架, 如MVVM Light等功能却一点都不差,加上很完善的文档,高覆盖率的单元测试,我认为它是一个很有潜力的MVVM框架.

    下面就通过一个类似Hello World的小例子, 给大家演示一下Stylet既简洁又强大的功能.

    创建工程

    创建一个标准的WPF工程, 命名为StyletStudy

    648050-20170519185123432-350749557.png

    安装Style.Start包

    打开包管理器命令行, 执行以下命令:

    Install-Package Stylet.Start.

    Stylet.Start会自动添加Stylet的引用, 并生成Stylet项目基本的文件, 安装成功后, 项目结构如下所示:

    648050-20170519190018838-897779811.png

    此时,你就可以按F5启动项目, 看看你的第一个Stylet项目的样子吧.

    648050-20170519190729869-430289677.png

    绑定属性

    当然,如果只是这样,那么根本没有展现Stylet的魅力, 下面我们加入一些小改动, 用来揭开Stylet美丽的面纱.

    1. ShellViewModel.cs中增加一个Name属性
    2. ShellView.xaml中增加一个TextBox, 绑定Name

    Name属性:

    using Stylet;
    
    namespace StyletStudy.Pages
    {
        public class ShellViewModel : Screen
        {
            public string Name { get; set; } = "waku";  // C#6的语法, 声明自动属性并赋值
        }
    }
    

    TextBox:

    <Window x:Class="StyletStudy.Pages.ShellView"
            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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:StyletStudy.Pages"
            mc:Ignorable="d"
            Title="Stylet Start Project" Height="350" Width="525"
            xmlns:s="https://github.com/canton7/Stylet"
            d:DataContext="{d:DesignInstance local:ShellViewModel}">
        <StackPanel>
            <TextBox Text="{Binding Name}"></TextBox>
        </StackPanel>
    </Window>

    也许你会注意到, 为TextBox设置绑定时, Visual Studio是有智能提示的:

    648050-20170519192259744-245637066.png

    这是因为贴心的Stylet已经为你将设计时的DataContext设置为ShellViewModel, 注意XAML的第10行:

    d:DataContext="{d:DesignInstance local:ShellViewModel}">

    再次启动, 可以看到属性的绑定已经成功了:

    648050-20170519193217213-437476729.png

    绑定命令

    Stylet中对Command的实现方式深受Caliburn.Micro的影响,这也是Caliburn.Micro一大亮点,即通过命名约定实现Command的绑定.

    1. ShellViewModel.cs中增加一个SayHello方法
    2. ShellView.xaml中增加一个Button, 绑定SayHello

    SayHello方法:

            public string Name { get; set; } = "waku";
    
            public void SayHello() => Name = "Hello " + Name;    // C#6的语法, 表达式方法
    }

    SayHello只是简单的在Name前加上"Hello ".

    Button:

        <StackPanel>
            <TextBox Text="{Binding Name}"></TextBox>
            <Button Content="Say Hello" Command="{s:Action SayHello}"></Button>
        </StackPanel>

    注意Command="{s:Action SayHello}的语法,s:Action就是Stylet的魔法之一, 如此绑定后, 当点击SayHello按钮后,会自动调用ViewModel中的SayHello方法, 是不是很神奇?

    启动程序,如果你在SayHello中加入一个断点,当点击SayHello按钮后,断点应该就被触发了:

    648050-20170519194810650-1003021582.png

    但是,你会发现文本框中的内容并没有被加上"Hello ",为什么呢?
    如果你是一个合格的WPF程序员,你应该发现了其中的问题: Name属性没有引发PropertyChanged通知

    实现PropertyChanged通知

    MVVM框架一般通过继承一个实现了INotifyPropertyChanged的基类, 然后在属性的set方法中, 引发PropertyChanged通知.
    不同的MVVM框架,可能用一些辅助方法来简化这一过程, 如下面是MVVM Light实现Name属性的方法:

            private string _name;
    
            public string Name
            {
                get { return _name; }
    
                set
                {
                    if (Set(ref _name, value))
                    {
                    }
                }
            }

    Stylet也可以用类似的方法来引发PropertyChanged, 但是如果只是那样我文章的标题就需要改名了:)
    为了清爽的ViewModel, Stylet内置了对PropertyChanged.Fody的支持.
    PropertyChanged.Fody是一个非常神奇的包, 它会在编译时为你的属性注入IL代码, 来引发PropertyChanged通知,是不是听上去就非常牛X?

    当然PropertyChanged.Fody不是Stylet专用的,你也可以在你自己的WPF项目中使用该包.
    为Stylet启用PropertyChanged.Fody只需要一条命令安装即可:

    Install-Package PropertyChanged.Fody

    安装后,代码无需任何修改,直接按F5运行.
    再点击SayHello按钮,看看是不是Hello了?

    648050-20170519203317713-402246390.png

    防护属性(Guard Properties)

    我想当TextBox为空时, 自动禁用SayHello按钮, 这样的需求在开发中很常见.
    Stylet为你考虑到了这一点,你只需要实现一个防护属性即可.
    对于SayHello方法, 实现一个CanSayHello属性, 返回一个bool型结果,标识SayHello是否可被执行.代码如下:

            public void SayHello() => Name = "Hello " + Name;    // C#6的语法, 表达式方法
    
            public bool CanSayHello => !string.IsNullOrEmpty(Name);  // 同上

    xaml中也需要为TextBox的绑定做一些修改:

            <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <Button Content="Say Hello" Command="{s:Action SayHello}"></Button>

    为绑定加上UpdateSourceTrigger=PropertyChanged, 这样只要Name有任何修改,会立即评估CanSayHello属性.

    再次启动项目,看看效果:

    648050-20170519203841135-1185923106.gif

    结语

    至此,我们Stylet的入门演示项目就开发完了,
    可以看到ViewModel中我们自己写的代码只有3行,就完成了属性绑定,命令绑定,防护属性功能. 是不是够清爽?

    当然,Stylet还有很多令人激动的特性,解决了长久以来WPF开发中的痛点,如弹出窗体消息框(通过WindowManager), 表单验证(通过ValidatingModelBase),甚至Stylet中还内置了一个性能非常棒的IoC容器.
    强烈建议感兴趣的朋友看看Stylet的WIKI,里面有很多值得学习和参考的东西.

    最后,祝大家工作生活愉快!

    转载于:https://www.cnblogs.com/waku/p/6879809.html

    展开全文
  • 指定父窗口,不行,之后调用一个线程启动一个窗口,还是不行,最后知道了Stylet框架已经为这类问题提供了解决方案,如下: 上代码 //Stylet提供的窗口管理类 [StyletIoC.Inject] public Stylet.IWindowManager ...

    弹出窗口导致程序突出仍在后台运行的问题,困扰了我蛮久,先是使用window.onwer=Application.Current.MainWindow;指定父窗口,不行,之后调用一个线程启动一个窗口,还是不行,最后知道了Stylet框架已经为这类问题提供了解决方案,如下:

    1. 上代码
    //Stylet提供的窗口管理类
    [StyletIoC.Inject]
    public Stylet.IWindowManager windowManager;
    
    //new 一个ViewModel,前提是有与之对应的View
    private YourViewModel YourViewModel = new YourViewModel ();
    
    public void btnRunClick()
    {
    	try
    	{
    		//result用于接收showDialog返回值
    		bool? result = false;
    		var root = Window.GetWindow(View).DataContext as Stylet.IViewAware;
    		result=windowManager.ShowDialog(YourViewModel , root);
    	
    		if (result == true)
    		{
    			MessageBox.Show("successed");
    		}
    	}
    	catch (System.Exception ex)
    	{
    		MessageBox.Show(ex.ToString());
    	}
    	          
    }
    
    展开全文
  • WPF mvvm框架 stylet 和Fody 的安装问题

    千次阅读 2019-01-07 18:16:55
    在Fody安装中遇到一个问题:安装后并没有实现通知的功能。解决:修改FodyWeavers.xml配置文件。添加一行&lt;PropertyChanged/&gt;(我的默认安装是没有这一行的,加上就好了 ) ...ut...
  • 官方示例使用 ContentControl。 <ContentControl s:View.Model="{Binding LeftSideBarViewModel}" DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center"/...
  • 使用Stylet框架,对WPF进行MVVM模式下的开发。不在xaml.cs中写业务逻辑,业务逻辑均在VM中,且业务逻辑只针对属性,不涉及ListBox控件。 实现功能: (1)ListBox添加一个项 (2)展示一个所选项的信息 (3)删除一...
  • 但是在WPF中(Stylet框架+MVVM开发模式),如果用同样的方法去实现,则会造成UI阻塞,进度条卡死,当耗时操作执行完毕后UI才刷新(参考下图)。 为什么会这样? 先看一下ViewModel ViewModel定义了用于表示耗时操作...
  • <Style x:Key="CircularButton" TargetType="Button"> <Setter Property="Height" Value="20"/> <Setter Property="Width" Value="20"/> <Setter Property="Background" Value="#ffffff...
  • 现有一项目用到了WPF+Winform 相互显示 winform中利用ElementHost控件嵌入一个wpf的usercontrol, usercontrol中有个button按钮,利用stylet框架,在usercontrolViewModel中有个buttonclick方法 现在调试一直...
  • 重写border,再用Scrollviewer将框撑起来 <Style x:Key="CornerIputNumberBox" TargetType="{x:Type TextBox}"> <Setter Property="Template"> <Setter.Value> ...ControlTemplate TargetType="{x:...
  • Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家.Stylet是受Caliburn Micro项目的启发, 所以借鉴了其中的很多概念, 同时精简了一些部分, 如只...
  • 需求:Stylet自定义控件,焦点在子控件中,父控件也需要处于被焦点选中状态做出相应的变化 父控件改为Button,使用选择器IsKeyboardFocusWithin,判断是否有子控件被选中为焦点,若父控件为TextBox是没有...
  • 上一章《【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(1)》中我们完成了一个简单的登录功能, 这一章主要演示如何对Stylet工程中的ViewModel进行单元测试.回忆一下我们的登录逻辑,主要有以下4点:当...
  • Stylet 简介

    2020-08-12 16:27:17
    Stylet是一个适用于WPF的轻量MVVM框架 特性 VM优先 经典的MVVM架构,View会实例化ViewModel ,ViewModel不知道View的存在 Stylet需要手动实例化VM,自动附加View Actions 可以绑定Command,也可以绑定Events Screen...
  • 入职后开始做MVVM开发模式的WPF开发工作,所以接触到Stylet框架,当逐渐对新的开发模式以及框架有所理解,像是打开了新世界,虽然我也只是开了个门缝,但是时刻保持学习的心态,以后会更好。 1 什么是Stylet框架? ...
  • 添加Moq包,我们使用Moq模拟一些Stylet的组件 Install-Package Moq -Version 4.13.1 添加Shouldly包,方便我们写Assert代码 Install-Package Shouldly -Version 3.0.2 在 StyletBookStore.Test 工程中新建一个名为 ...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

styletwpf