wpf_wpf datagrid - CSDN
wpf 订阅
WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。 展开全文
WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
信息
属    于
微软
类    型
图形系统
中文名
Windows呈现基础
外文名
Windows Presentation Foundation
WPF定义
WPF 为Windows Presentation Foundation的首字母缩写 ,中文译为“Windows呈现基础”,其原来代号为“Avalon”,因与“我佩服”拼音首字母组合一样,国内有人调侃地称之为“我佩服”。由 .NET Framework 3.0 开始引入,与 Windows Communication Foundation及 Windows Workflow Foundation并行为新一代 Windows操作系统以及 WinFX 的三个重大应用程序开发类库。WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上版本下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得 益于WPF。 程序员在WPF的帮助下,要开发出媲美Mac程序的酷炫界面已不再是遥不可及的奢望。 WPF相对于Windows客户端的开发来说,向前跨出了巨大的一步,它提供了超丰富的.NET UI 框架,集成了矢量图形,丰富的流动文字支持(flow text support),3D视觉效果和强大无比的控件模型框架。Windows Presentation Foundation(以前的代号为“Avalon”)是 Microsoft 用于 Windows 的统一显示子系统,它通过 WinFX 公开。它由显示引擎和托管代码框架组成。Windows Presentation Foundation 统一了 Windows 创建、显示和操作文档、媒体和用户界面 (UI) 的方式,使开发人员和设计人员可以创建更好的视觉效果、不同的用户体验。Windows Presentation Foundation 发布后,Windows XP、Windows Server 2003 和以后所有的 Windows操作系统版本都可以使用它。WPF是.Net Framework 3.0 里新推出的主打功能之一,加上Vista集成.Net Framework 3.0,改写Winform时代,可谓是影响巨大!WPF是一套API函数库,由.Net FrameWork3.0以上版本类库运行。WPF是Windows操作系统中一次重大变革,与早期的GDI+/GDI不同。WPF是基于DirectX引擎的,支持GPU硬件加速,在不支持硬件加速时也可以使用软件绘制。高级别的线程绘制可以提高使用者的体验。自动识别显示器分辨率并进行缩放。而Vista就是一个非常典型的例子。 [1] 
收起全文
精华内容
参与话题
  • WPF入门教学(C#窗口、客户端)

    万次阅读 多人点赞 2018-04-16 11:04:52
    最近在做版本更新,自己写了一个...为了后来者,减少些时间熟悉WPF,下面直入主题:1,打开VS(我使用的是vs2015),新建项目,选择WPF,名称为StudyWPF,如下图:2,WPF的初始界面,有解决方案,MainWindow.xaml和X...

    最近在做版本更新,自己写了一个更新器。一开始是使用C#窗口程序,发现C#窗口程序对于图片的处理有问题,图片四周的锯齿很明显,然后查找了微软有没有其他编译器,发现了WPF,摸索花费了一些时间。为了后来者,减少些时间熟悉WPF,下面直入主题:

    1,打开VS(我使用的是vs2015),新建项目,选择WPF,名称为StudyWPF,如下图:


    2,WPF的初始界面,有解决方案,MainWindow.xaml和XAML,如下图所示:


    3,新建Resources文件夹,右键点击项目,选择添加,选择新建文件夹,重命名为Resources,如下图所示:


    4,将所需的资源如图片,放在Resources文件夹下面,操作步骤如下图:

    (1)双击Resources.resx,选择图像(添加图片资源)


    (2)添加资源选择现有文件,然后选择你需要图片资源,如下图:


    最后,Ctrl+S保存,图片资源添加完成,其他资源添加类似。

    5,对图片资源进行处理,使生成exe文件包含我们添加的图片资源(适用于资源较少的情况下,若资源文件很多,需要使用相对路径指向相应的资源,本次不讲解资源过多的情况),操作如下图所示:

    (1)选中图片资源(可以选中多张),右键选择属性:


    (2)将属性中生成操作设置为Resource:


    现在,生成的exe文件就包含了图片资源。

    6,搭建软件UI操作界面,双击解决方案里面的MainWindow.xaml,进入UI可视化编辑,WPF控件存放需要容器,微软给我们提供了好几种,如:Grid、Cavas等,有什么区别还没有去深究,我用的是Grid,将Grid设置和窗口大小一样,位置设为(0,0),操作如下:

    (1)双击解决方案里面的MainWindow.xaml,页面为新建项目时页面一样,然后点击工具箱。


    (2)在常用WPF控件里面找到Grid,拖入MainWindow里面。


    (3)查看窗口大小


    (4)点击Grid,然后点击属性,设置grid的大小、位置和名字


    7,如上操作拖入Image控件,用作背景,设置大小,位置和grid一样,名字设置为BG,选取资源图片为背景


    8,添加Label控件,位置,大小自己拖拽设置,名字的设置为TestName。


    9,拖入Button控件,位置大小自己拖拽设置,并双击Button控件,然后进行代码逻辑实现。

    (1)双击


    (2)编写代码逻辑



    10,重新生成解决方案,然后在debug下面找到exe文件运行下,看下效果或直接点击启动也可以看到效果。

    (1)重新生成解决方案


    (2)找到exe文件



    (3),双击exe文件,点击button。



    总结:简单WPF入门教程写完了,希望对你有帮助。2018\4\8






    展开全文
  • WPF开发教程 ----WPF C# 编程 界面开发(很不错)

    千次下载 热门讨论 2020-07-30 23:30:53
    WPF开发教程.rar 目录 WPF基础入门 3 1. WPF基础之体系结构 3 2. WPF基础之XAML 9 3. WPF基础之基元素 23 4. WPF基础之属性系统 26 5. WPF基础之路由事件 33 6. WPF基础之布局系统 46 7. WPF基础之样式设置和模板化...
  • WPF入门教程(一)---基础

    万次阅读 多人点赞 2018-08-20 10:39:54
    最近在学习WPF,学习WPF首先上的是微软的MSDN,然后再搜索了一下网络有关WPF的学习资料。为了温故而知新把学习过程记录下来,以备后查。这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用...

    前言

    最近在学习WPF,学习WPF首先上的是微软的MSDN,然后再搜索了一下网络有关WPF的学习资料。为了温故而知新把学习过程记录下来,以备后查。这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用程序。

    首先说一下学习WPF的基础知识:
    1) 要会一门.NET所支持的编程语言。例如C#。
    2) 会一点“标准通用标记语言”:WPF窗体程序使用的XAML语言,也属于“标准通用标记语言”的一个分支。如果以前接触过XML、HTML、XHTML、ASP.NET之类的“标准通用标记语言”,对于学习是有所帮助的。
    3) 有一定的WinForm或ASP.NET经验,主要是对控件事件的处理要有所了解。
    4) 拥有良好的面向对象的思想:在WPF中,经常要灵活运用各种继承关系、多态、重载等。
    5) DataBinding要有所了解:Binding是WPF的一大亮点。
    6) 对设计模式要有一定的了解:当然是越深入越好了,在实际项目中,各种设计模式经常交融使用。

    开发基础

    第一、在装好以上所说的工具之后,打开Visual Studio 2013,选择“菜单—》文件—》新建—》项目”。如下图。
    这里写图片描述
    第二、在“新建项目”对话框中选择“WPF应用程序”,修改名称为WpfApp1,然后点击“确定”按钮,便成功创建了一个“WPF应用程序”。新创建的项目所引用的公共类库如下。如下图。(“WPF应用程序”会在“引用”里面自动添加下图中所示的 PresentationCore、PresentationFramework、WindowsBase三大核心程序集)。
    这里写图片描述
    第三、WpfApp1项目的生成的文件结构。如下图。
    这里写图片描述
    第四、在App.xaml中的“StartupUri”属性可以指定项目运行时的启动窗体。如下图中“StartupUri=”MainWindow.xaml””,还可以定义我们需要的系统资源以及引入程序集等。如下图。这里写图片描述
    第五、在MainWindow.xaml的设计窗体中我们可以修改Title。还可以设置MainWindow的属性和添加事件。完成了这些设置以后,我们就可以对窗体添加内容了,如下图。我在这个窗体中添加了一个ListView、两个WrapPanel、两个Button等
    这里写图片描述
    第六、在WPF的xmal文件中还可以添加如下资源。如下图。这里写图片描述

    展开全文
  • 本课程通过一个个实战的案例,详细介绍了在WPF编程中用到的各种技巧,帮你进一步掌握WPF这种优秀的编程框架。也许你曾经为了一个WPF又酷又炫的功能,查遍资料却终无所获,最后无奈遗憾放弃。如果你学习了这门课程,...
  • WPF 技术主要特点是数据驱动界面 UI,当数据发生变化时,WPF 将自动通知 UI 界面同步更新,MVVM 模式充分利用了 WPF 的依赖属性、数据和命令绑定等机制,最大限度地界面显示和逻辑代码之间的耦合度,如需要调整界面...
  • WPF&WCF实现聊天程序

    2019-09-02 16:38:03
    链接:http://www.codeproject.com/Articles/21264/WPF-WCF-Chat-Application-Simplified-via-P2P ...

    链接:http://www.codeproject.com/Articles/21264/WPF-WCF-Chat-Application-Simplified-via-P2P

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21203649/viewspace-757568/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/21203649/viewspace-757568/

    展开全文
  • 这篇文章将讲述实现WPF的UI和WCF中的双工通信。实现文字部分的聊天功能和实现共享白板的功能。 画WPF的界面其实是一件麻烦的事情。虽然WPF和WindowsForm一样,能将控件拖到哪,它就在哪。我们在开发asp.net项目的...

        这篇文章将讲述实现WPF的UI和WCF中的双工通信。实现文字部分的聊天功能和实现共享白板的功能。

        画WPF的界面其实是一件麻烦的事情。虽然WPF和WindowsForm一样,能将控件拖到哪,它就在哪。我们在开发asp.net项目的时候用从原始的table布局,到现在流行的div+css布局。这些都需要设计人员的仔细设计。这个程序的布局我采用Grid和StackPanel两种方式。Gird类似html的表格布局,StackPanel就就像它的字面意思“堆栈面板”。

    WPF的UI实现

        首先新建一个wpf的应用程序,改名为ZqlChart。添加一个UserControl,用来实现登陆窗体,这个是用了StackPanel进行布局。XAML代码如下:

    <UserControl x:Class="ZqlChart.LoginControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="210" Width="350" Loaded="UserControl_Loaded">
        <StackPanel>
            <Border Height="220" BorderBrush="#FFFFFFFF" BorderThickness="2,2,2,0" CornerRadius="5,5,0,0">
                <Border.Background>
                    <LinearGradientBrush EndPoint="0.713,0.698" StartPoint="0.713,-0.139">
                        <GradientStop Color="#FFFFFFFF" Offset="0.933"/>
                        <GradientStop Color="LightBlue" Offset="0.337"/>
                    </LinearGradientBrush>
                </Border.Background>
                <StackPanel Name="infoPanel" Orientation="Vertical" Margin="10,10,10,10">
                    <StackPanel Name="typePanel" Orientation="Horizontal">
                        <RadioButton Name="chatTypeServer" FontSize="24" Margin="80,0,20,0" 
                                     Checked="chatTypeServer_Checked" VerticalContentAlignment="Center">服务端</RadioButton>
                        <RadioButton Name="chatTypeClient" FontSize="24" Checked="chatTypeClient_Checked" VerticalContentAlignment="Center">客户端</RadioButton>
                    </StackPanel>
                    <StackPanel Name="serverPanel" Orientation="Horizontal" Margin="0,10,0,0">
                        <Label Name="lblServer" FontSize="20" Width="120" HorizontalContentAlignment="Right" VerticalContentAlignment="Center">服务端:</Label>
                        <TextBox Height="30" Name="txtServer" Width="160" FontSize="20" VerticalContentAlignment="Center" />
                    </StackPanel>
                    <StackPanel Name="usernamePanel" Orientation="Horizontal" Margin="0,10,0,10">
                        <Label Name="lblUserName" FontSize="20" Width="120" HorizontalContentAlignment="Right">用户名:</Label>
                        <TextBox Height="30" Name="txtUserName" Width="160" FontSize="20" VerticalContentAlignment="Center" />
                    </StackPanel>
                    <StackPanel Name="buttonPanel" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                        <Button Name="btnLogin" Width="120" FontSize="20" Margin="10,10,10,10" Click="btnLogin_Click">连接</Button>
                        <Button Name="btnCancel" Width="120" FontSize="20" Margin="10,10,10,10" Click="btnCancel_Click">取消</Button>
                    </StackPanel>
                </StackPanel>
            </Border>
    
        </StackPanel>
    </UserControl>

    界面效果如下:

    wpf3

    聊天的主界面,如下图:

    wpf4

    大框架是3行3列。XAML代码如下:

    <Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="ZqlChartMainWindow"
     	x:Class="ZqlChart.ZqlChartWindow" 
        Title="麒麟语音聊天室” Height="600" Width="800"
        Background="#FF3B3737" Loaded="Window_Loaded" MinWidth="800" MinHeight="500">
        <Grid x:Name="LayoutRoot" >
            <Grid.RowDefinitions>
            
                <RowDefinition Height="50" />
                <RowDefinition Height="261" />
                <RowDefinition Height="250" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="150" />
                <ColumnDefinition Width="580*" />
                <ColumnDefinition Width="48" />
            </Grid.ColumnDefinitions>
    
            <Border Name="BorderUsersList" Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" CornerRadius="8,8,8,8" Background="LightBlue" BorderThickness="0,0,4,4" >
                <ListView Name="lvUsers" Margin="10" FontSize="20">
                    <ListView.BitmapEffect>
                        <DropShadowBitmapEffect />
                    </ListView.BitmapEffect>
                </ListView>
            </Border>
    
            <Border Name="BorderEditingType" Grid.ColumnSpan="3" CornerRadius="8,8,8,8" Background="LightBlue" BorderThickness="0,4,4,4">
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                    <Button Margin="0,0,0,0"  Height="28" Width="121" Click="Button_Click" Background="White">
                      
                    </Button>
                    <RadioButton Name="rbInk" Content="墨水" Margin="15,0,0,0" VerticalAlignment="Center" FontSize="20" IsChecked="True" 
                                     Tag="{x:Static InkCanvasEditingMode.Ink}" Click="rbInkType_Checked">
                        </RadioButton>
                    <RadioButton Name="rbEraserByStroke" Content="一笔一笔清除" Margin="15,0,0,0" VerticalAlignment="Center" FontSize="20" 
                                     Tag="{x:Static InkCanvasEditingMode.EraseByStroke}" Click="rbInkType_Checked">
                        </RadioButton>
                    <RadioButton Name="rbEraserByPoint" Content="一点一点清除" Margin="15,0,0,0" VerticalAlignment="Center" FontSize="20" 
                                     Tag="{x:Static InkCanvasEditingMode.EraseByPoint}" Click="rbInkType_Checked">
                        </RadioButton>
                        <TextBlock Margin="25,0,10,0" VerticalAlignment="Center" FontSize="20" >:</TextBlock>
                        <Button Margin="0,0,0,0" Background="White" Height="28" Width="64" Click="OnSetFill">
                            <Rectangle Width="54" Height="20" Stroke="Black" StrokeThickness="2">
                                <Rectangle.Fill>
                                    <SolidColorBrush Color="{Binding ElementName=ZqlChartMainWindow, Path=FillColor}" />
                                </Rectangle.Fill>
                            </Rectangle>
                        </Button>
                        
                </StackPanel>
            </Border>
    
            <Border Name="BorderInkCanvas" Grid.Column="1" Grid.Row="1" Background="LightBlue" BorderThickness="4,4,4,4" CornerRadius="8,8,8,8" Grid.ColumnSpan="2">
                <InkCanvas x:Name="inkCanv" Margin="10" Background="White" 
                            StrokeCollected="inkCanv_StrokeCollected" StrokeErasing="inkCanv_StrokeErasing" 
                           StrokeErased="inkCanv_StrokeErased" VerticalAlignment="Top" >
                </InkCanvas>
            </Border>
    
            <Border Name="BorderInkMessage" Grid.Column="1" Grid.Row="2" Background="LightBlue" BorderThickness="0,0,4,4" CornerRadius="8,8,8,8" Grid.ColumnSpan="2">
                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition  Height="30" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="500*" />
                        <ColumnDefinition Width="62*" />
                        <ColumnDefinition Width="62*" />
                    </Grid.ColumnDefinitions>
                    <Border  Grid.Column="1" Grid.Row="1" Background="LightBlue" BorderThickness="4,4,4,4" CornerRadius="8,8,8,8" >
                        <Button Content="发送"  Height="23"  Name="btnSend"  Click="btnSend_Click" />
                    </Border>
                    <Border  Grid.ColumnSpan="3" Background="LightBlue" BorderThickness="4,4,4,4" CornerRadius="8,8,8,8" >
                        <TextBox   Name="txtAllMessage" >
                            <TextBox.BitmapEffect>
                                <DropShadowBitmapEffect />
                            </TextBox.BitmapEffect>
                        </TextBox>
                    </Border>
                    <Border  Grid.Row="1" Background="LightBlue" BorderThickness="4,4,4,4" CornerRadius="8,8,8,8" >
                        <TextBox Grid.Row="1" Name="txtMessage" />
                    </Border>
                    <Border  Grid.Column="2" Grid.Row="1"  Background="LightBlue" BorderThickness="4,4,4,4" CornerRadius="8,8,8,8" >
                        <Button  Content="关闭" Name="btnLeave"  Height="23" FontSize="10" Click="btnLeave_Click">
    
                        </Button>
                    </Border>
                </Grid>
            </Border>
            <Canvas Name="loginCanvas" Grid.Column="1" Grid.Row="1" Width="500" Height="300" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="39,78,41,0" Grid.RowSpan="2" />
        </Grid>
    </Window>
    
    窗体就设计好了。
    WCF双工通信:

        双工通信能允许服务通知用户当前的进度情况。我们可以通过使用指定CallbackContract的ServiceContract属性的服务使用双工,如服务器端的代码如下:

    [ServiceContract(CallbackContract = typeof(IService1Callback))]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }
     
    [ServiceContract]
    public interface IService1Callback
    {
        [OperationContract]
        void Reply(string message);
    }

        客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            var callback = new Service1Callback();
            var proxy = new Service1Client(new InstanceContext(callback));
            Console.WriteLine(proxy.GetData(42));
            Console.ReadLine();
        }
    }
     
    class Service1Callback : IService1Callback
    {
        public void Reply(string message)
        {
            Console.WriteLine(message);
        }
    }

        这篇文章中我将利用WCF的双工通信实现文字聊天的功能和共享白板的功能。

        定义协议:

        public interface IZqlChartService
        {
            [OperationContract()]
            bool Join(ChatUser chatUser);
    
            [OperationContract()]
            void Leave(ChatUser chatUser);
    
            [OperationContract]
            void SendBroadcastMessage(string strUserName, string message);
    
            [OperationContract()]
            bool IsUserNameTaken(string strUserName);
    
            [OperationContract()]
            void SendInkStrokes(MemoryStream memoryStream);
    
    
        }

    定义回调:

        public interface IZqlChartServiceCallback
        {
            [OperationContract(IsOneWay = true)]
            void NotifyMessage(string message);
    
            [OperationContract(IsOneWay = true)]
            void UpdateUsersList(List<ChatUser> listChatUsers);
    
            [OperationContract(IsOneWay = true)]
            void OnInkStrokesUpdate(ChatUser chatUser, byte[] bytesStroke);
    
            [OperationContract(IsOneWay = true)]
            void ServerDisconnected();
    
        }
    

    实现服务:

        public class ZqlChartService : IZqlChartService
        {
            public static Dictionary<IZqlChartServiceCallback, ChatUser> s_dictCallbackToUser = new Dictionary<IZqlChartServiceCallback, ChatUser>();
    
            public ZqlChartService()
            {
            }
    
            public bool Join(ChatUser chatUser)
            {
                IZqlChartServiceCallback client = OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>();
    
                if (s_dictCallbackToUser.ContainsValue(chatUser) == false)
                {
                    s_dictCallbackToUser.Add(client, chatUser);
                }
    
                foreach (IZqlChartServiceCallback callbackClient in s_dictCallbackToUser.Keys)
                {
                    callbackClient.UpdateUsersList(s_dictCallbackToUser.Values.ToList());
                }
    
                return true;
            }
    
            public void Leave(ChatUser chatUser)
            {
                IZqlChartServiceCallback client = OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>();
                if (s_dictCallbackToUser.ContainsKey(client))
                {
                    s_dictCallbackToUser.Remove(client);
                }
    
                foreach (IZqlChartServiceCallback callbackClient in s_dictCallbackToUser.Keys)
                {
                    if (chatUser.IsServer)
                    {
                        if (callbackClient != client)
                        {
                            //server user logout, disconnect clients
                            callbackClient.ServerDisconnected();
                        }
                    }
                    else
                    {
                        //normal user logout
                        callbackClient.UpdateUsersList(s_dictCallbackToUser.Values.ToList());
                    }
                }
    
                if (chatUser.IsServer)
                {
                    s_dictCallbackToUser.Clear();
                }
            }
    
            public bool IsUserNameTaken(string strNickName)
            {
                foreach (ChatUser chatUser in s_dictCallbackToUser.Values)
                {
                    if (chatUser.NickName.ToUpper().CompareTo(strNickName) == 0)
                    {
                        return true;
                    }
                }
                return false;
            }
    
            public void SendInkStrokes(MemoryStream memoryStream)
            {
                IZqlChartServiceCallback client = OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>();
    
                foreach (IZqlChartServiceCallback callbackClient in s_dictCallbackToUser.Keys)
                {
                    if (callbackClient != OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>())
                    {
                        callbackClient.OnInkStrokesUpdate(s_dictCallbackToUser[client], memoryStream.GetBuffer());
                    }
                }
            }
    
            public void SendBroadcastMessage(string clientName, string message)
            {
                IZqlChartServiceCallback client =
                    OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>();
    
                if (client != null)
                {
    
                    foreach (IZqlChartServiceCallback callbackClient in s_dictCallbackToUser.Keys)
                    {
                        if (callbackClient != OperationContext.Current.GetCallbackChannel<IZqlChartServiceCallback>())
                        {
                            callbackClient.NotifyMessage(clientName + ": " + message);
                        }
                    }
                }
            }
    
        }

     

    客户端:

        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
        public partial class ZqlChartServiceClient : System.ServiceModel.DuplexClientBase<IZqlChartService>, IZqlChartService
        {
    
            public ZqlChartServiceClient(System.ServiceModel.InstanceContext callbackInstance) :
                base(callbackInstance)
            {
            }
    
            public ZqlChartServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) :
                base(callbackInstance, endpointConfigurationName)
            {
            }
    
            public ZqlChartServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) :
                base(callbackInstance, endpointConfigurationName, remoteAddress)
            {
            }
    
            public ZqlChartServiceClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
                base(callbackInstance, endpointConfigurationName, remoteAddress)
            {
            }
    
            public ZqlChartServiceClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
                base(callbackInstance, binding, remoteAddress)
            {
            }
    
            public bool Join(ZqlChartObjects.ChatUser chatUser)
            {
                return base.Channel.Join(chatUser);
            }
    
            public void Leave(ZqlChartObjects.ChatUser chatUser)
            {
                base.Channel.Leave(chatUser);
            }
    
            public bool IsUserNameTaken(string strUserName)
            {
                return base.Channel.IsUserNameTaken(strUserName);
            }
    
            public void SendInkStrokes(System.IO.MemoryStream memoryStream)
            {
                base.Channel.SendInkStrokes(memoryStream);
            }
    
            public void SendBroadcastMessage(string strUserName, string message)
            {
                base.Channel.SendBroadcastMessage(strUserName, message);
            }
    
    
    
        }

    客户端回调类:

        public class ClientCallBack : IZqlChartServiceCallback
        {
            public static ClientCallBack Instance;
            private SynchronizationContext m_uiSyncContext = null;
            private ZqlChartWindow m_mainWindow;
            //ActiveCallWindow _activeCallForm;
            //CallManager _callManager;
            public ClientCallBack(SynchronizationContext uiSyncContext, ZqlChartWindow mainWindow)
            {
                m_uiSyncContext = uiSyncContext;
                m_mainWindow = mainWindow;
            }
    
            public void OnInkStrokesUpdate(ZqlChartObjects.ChatUser chatUser, byte[] bytesStroke)
            {
                SendOrPostCallback callback =
                          delegate(object state)
                          {
                              m_mainWindow.OnInkStrokesUpdate(state as byte[] );
                          };
    
                m_uiSyncContext.Post(callback, bytesStroke);
    
                SendOrPostCallback callback2 =
                          delegate(object objchatUser)
                          {
                              m_mainWindow.LastUserDraw(objchatUser as ZqlChartObjects.ChatUser);
                          };
                m_uiSyncContext.Post(callback2, chatUser);
            }
    
            public void UpdateUsersList(List<ZqlChartObjects.ChatUser> listChatUsers)
            {
                SendOrPostCallback callback =
                         delegate(object objListChatUsers)
                         {
                             m_mainWindow.UpdateUsersList(objListChatUsers as List<ZqlChartObjects.ChatUser>);
                         };
    
                m_uiSyncContext.Post(callback, listChatUsers);
            }
    
            public void ServerDisconnected()
            {
                SendOrPostCallback callback =
                            delegate(object dummy)
                            {
                                m_mainWindow.ServerDisconnected();
                            };
    
                m_uiSyncContext.Post(callback, null);
            }
            public void NotifyMessage(string message)
            {
                SendOrPostCallback callback =
                                  delegate(object dummy)
                                  {
                                      m_mainWindow.NotifyMessage(message);
                                  };
    
                m_uiSyncContext.Post(callback, message);
            }
    
    
            public bool AcceptCall(string username)
            {
                //调獭?用?线?程ì必?须?为a STA,?因皑?为a许í多à UI 组哩?件t都?需è要癮。£
                return MessageBox.Show(String.Format("Accep call from \"{0}\" ", username), "Incomming Call", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes;
            }
    
        }
    效果:
    1、服务端登陆:
     
    2、客户端登录:
     
    3、文字聊天
     

     

     

    4、共享白板:

    wpf10

    总结:这篇文章实现了WPF的UI界面以及文字聊天和共享白板的功能。下一篇文章中将在此基础上实现语音通话的功能。




    本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/06/06/1752525.html,如需转载请自行联系原作者

    展开全文
  • 在Silerlight4中已经集成了摄像和采集声音的功能,但是在WPF4中却没有直接可以用的的控件,由此也可以看出,由桌面程序走向web程序的大趋势。如果你想用Silverlight实现类似的音频聊天室,下面我列出...
  • 原文地址:MsProjecthttp://www.msproject.cn/Article/DrawMe.html 翻译Tim Callaghan,Alvin Lim著DrawMe - A network ink-chat application exploring .NET 3.5, WPF and WCF flanker 翻译 in ms...
  • WPF基本介绍

    千次阅读 2019-06-04 21:40:16
    开发工具与关键技术:Visual Studio 2015 作者:邓李庆 撰写时间:2019年5月29日 下面给大家讲C/S与B/S区别和定义。C/S结构:即Client/Server(客户机/服务器)结构,是软件系统体系结构,通过将任务合理分配到...
  • 转自:...对于老牌控件提供商葡萄城来说,这是WPF系列控件一个重要的机遇,因此,Spread Studio for WPF产品做了一次重要更新,并随着Spread Studio 8.0发布。鉴于此,选择翻译并整理了一篇自codeproj
  • WPF开发教程

    千次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门.... 3 1. WPF基础之体系结构... 3 2. WPF基础之XAML. 9 3. WPF基础之基元素... 23 4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... ...
  • 几种设计模式 (WPF MVP MVVM )

    千次阅读 2016-02-23 11:02:11
    WPF 编辑词条 B 添加义项  ? WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,...
  • WPF中的换行符

    万次阅读 2012-08-28 10:39:04
    WPF中UI上和后台代码中的换行符不同。 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine
  • WPF DataGrid默认显示垂直滚动条
  • WPF揭密--WPF就是做好看界面的

    万次阅读 2007-03-28 17:50:00
    其实WPF没有大家想的那么神秘,它只不过是用来做界面的,它的主要特点就是容器套容器,WPF里面有好几种panel容器类型,可以循环嵌套, 比如可以在button里面放个panel,panel里面再放复杂控件,也可以用path对象自己...
  • WPF】Button按钮添加背景图片

    万次阅读 2017-01-10 09:14:36
    按钮背景图片
  • WPF 实现label换行

    万次阅读 2012-07-06 09:56:53
    Label MaxWidth="550">TextBlock TextWrapping="Wrap"Text="在此输入要换行的文字,前提是它足够长,并且Label的MaxWidth不足以让它一行显示。" />Label>
  • WPF使窗体弹出时在屏幕居中位置

    万次阅读 2017-07-13 14:13:40
    在窗体页面的CS代码中添加 WindowStartupLocation = WindowStartupLocation.CenterScreen; public partial class MainWindow : Window { public MainWindow() ... WindowStartupLocatio
  • https://www.cnblogs.com/findumars/p/6339340.html
1 2 3 4 5 ... 20
收藏数 121,955
精华内容 48,782
关键字:

wpf