我有一个使用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) 我有一个客户端 - 服务器应用程序,它使用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"方法?上面的代码有什么问题吗?
谢谢!