小编Jos*_* B.的帖子

在ModelView中更改样式(MVVM + WPF)

我有一个使用MVVM模式(MVVM Light Toolkit)在WPF中开发的应用程序.

到目前为止,我没有遇到任何问题,直到在运行时更改与我的一些控件相关联的样式,即一组MenuItem.(它们最多可以有三种不同的风格).

如果我不使用MVVM,我可以使用以下命令解决它:

MenuElement_Left4.Style = (Style)FindResource("MenuButtonTabsLeft");
Run Code Online (Sandbox Code Playgroud)

但是因为我想在MVVM中完全做到这一点,我已经完成了这些测试来实现:

1)尝试使用绑定更改样式(这没有用):

<MenuItem x:Name="MenuElement_Left4" Header="Test" Style="{Binding SelectedStyle}">
Run Code Online (Sandbox Code Playgroud)

在ViewModel中:

public string SelectedStyle
    {
       get { return this.selectedStyle; }
       set { this.selectedStyle = value; 
             RaisePropertyChanged("SelectedStyle");
           }
    }
    private string selectedStyle;
Run Code Online (Sandbox Code Playgroud)

2)使用DataTrigger更改样式(这也没有用.引发异常(样式触发器应用另一个样式)):

<MenuItem.Style>
    <Style TargetType="{x:Type MenuItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=TestStyle}" Value="True">
                <Setter Property="Style" Value="{StaticResource  MenuButtonTabsLeftArrow}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=TestStyle}" Value="False">
                <Setter Property="Style" Value="{StaticResource  MenuButtonTabsLeft}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</MenuItem.Style>
Run Code Online (Sandbox Code Playgroud)

最后,我设法使用以下代码使用Combox来解决它(我只使用ComboBox来改变MenuItems的样式,因此它是不可见的).从(如何在运行时更改元素样式?)获得了想法:

<MenuItem x:Name="MenuElement_Left4" Header="Test" Style="{Binding ElementName=AvailableStyles, Path=SelectedItem.Tag}">
<ComboBox Name="AvailableStyles" SelectedIndex="{Binding AvailableStylesIndex}" Visibility="Collapsed">
    <ComboBoxItem …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml styles mvvm

5
推荐指数
1
解决办法
5963
查看次数

何时关闭UDP套接字

我有一个客户端 - 服务器应用程序,它使用UDP套接字发送数据,数据只需要从客户端传送到服务器,服务器将始终具有相同的IP.唯一的要求是我必须每秒发送大约10封邮件的消息

目前我正在通过以下方式进行:

public void SendData(byte[] packet)
{
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort);
    UdpClient udpChannel = new UdpClient(sourcePort);
    udpChannel.Connect(end_point);
    udpChannel.Send(packet, packet.Length);
    udpChannel.Close();
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我使用命令"udpChannel.Close()"时,服务器没有收听时需要2-3秒.(我已经看到了同样的问题:如果我不调用UdpClient.Close()方法有什么缺点?)

我的问题是,如果我总是将数据包发送到相同的IP地址和端口,是否有必要连接套接字并在每次发送请求后关闭它?

我打算使用的代码如下:

UdpClient udpChannel;

public void SendData(byte[] packet)
{
    udpChannel.Send(packet, packet.Length);
}

public void Initialize(IPAddress IP, int port)
{
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort);
    UdpClient udpChannel = new UdpClient(sourcePort);
    udpChannel.Connect(end_point);
}

public void Exit()
{
    udpChannel.Close();
}
Run Code Online (Sandbox Code Playgroud)

这样做,在发送数据之前是否有必要检查"SendData"方法?上面的代码有什么问题吗?

谢谢!

c# sockets udp

5
推荐指数
1
解决办法
9725
查看次数

标签 统计

c# ×2

mvvm ×1

sockets ×1

styles ×1

udp ×1

wpf ×1

xaml ×1