小编Jus*_*hew的帖子

按钮上的ContextMenu单击不触发命令

这是一个问题.

我在按钮单击时显示上下文菜单,菜单命令ICommand在视图模型中绑定到.菜单显示在按钮单击和右键单击上.问题是当我单击按钮然后单击上下文菜单时菜单单击不触发,但是当我右键单击按钮然后单击菜单时,我可以确认菜单正在工作.

 <Button Grid.Row="3" Width="500" Height="30" Name="cmButton"  >
    Button with Context Menu
    <Button.ContextMenu>
        <ContextMenu DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Mode=Self}}"  >
            <MenuItem  DataContext="{Binding}" Header="New Layout Element..." Command="{Binding Path=SubmitBtn}" />                  
        </ContextMenu>
    </Button.ContextMenu>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>                    
        </Style>
    </Button.Style>
 </Button>
Run Code Online (Sandbox Code Playgroud)

我可以确认我的视图模型没有任何问题,因为当我右键单击按钮然后单击上下文菜单时命令会触发.

wpf contextmenu onclick button

2
推荐指数
1
解决办法
2538
查看次数

C# Readonly List 线程同步

我在这里所做的是通过 for-each 和索引方法在多个线程中导航只读列表。结果看起来线程安全,但我不相信。

有人可以告诉下面的代码(从只读列表中读取)是否是线程安全的吗?如果是的话为什么?

public class ThreadTest
{
   readonly List<string> port;

    public  ThreadTest()
    {
        port = new List<string>() { "1", "2", "3", "4", "5", "6" };            
    }

    private void Print()
    {
        foreach (var itm in port)
        {
            Thread.Sleep(50);
            Console.WriteLine(itm+"----"+Thread.CurrentThread.ManagedThreadId);
        }
    }

    private void Printi()
    {
        for(int i=0;i<5;i++)
        {
            Thread.Sleep(100);
            Console.WriteLine(port[i] + "--iiiii--" + Thread.CurrentThread.ManagedThreadId);
        }
    }

    public void StartThread()
    {
        Task[] tsks = new Task[10];
        tsks[0] = new Task(Print);
        tsks[1] = new Task(Print);
        tsks[2] = new Task(Print);
        tsks[3] = new …
Run Code Online (Sandbox Code Playgroud)

c# multithreading synchronization thread-safety

2
推荐指数
1
解决办法
1550
查看次数