从ViewModel在View上移动控件

时间:2019-01-03 20:23:20

标签: wpf mvvm prism

我正在尝试使用WPF,Prism和MVVM制作垄断游戏。 在我的视图上,我有一个分为几行和几列的网格。每个单元都是一个单独的游戏卡,例如一个城市。

我还有一个内容控件,可将玩家显示为筹码。

任务是相对于网格中的单元移动我的玩家。 我需要从ViewModel中执行此操作(我希望ViewModel以某种方式告诉我的View播放器位置)。请帮我解决这个问题。

我的观点:

            <!--bottom row-->
            <ContentControl Grid.Row="10" Grid.Column="10" Content="{Binding Cards[0]}" ContentTemplateSelector="{StaticResource CardTemplateSelector}"/>
            <ContentControl Grid.Row="10" Grid.Column="9" Content="{Binding Cards[1]}" ContentTemplateSelector="{StaticResource CardTemplateSelector}"/>
            ...

            <!--left column-->
            <ContentControl Grid.Row="9" Grid.Column="0" Content="{Binding Cards[11]}"  ContentTemplateSelector="{StaticResource CardTemplateSelector}"/>
            <ContentControl Grid.Row="8" Grid.Column="0" Content="{Binding Cards[12]}"  ContentTemplateSelector="{StaticResource CardTemplateSelector}"/>
            ...

            <!--top row-->
            <ContentControl Grid.Row="0" Grid.Column="0" Content="{Binding Cards[20]}"  ContentTemplateSelector="{StaticResource CardTemplateSelector}"/>
            ...

            <!--right column-->
            ...

            <!--player chips-->
            <ContentControl Grid.Row="10" Grid.Column="10" Content="{Binding Players[0]}"  ContentTemplate="{StaticResource PlayerTemplate1}"/>
            ...

我期望的是: 1)模型掷骰子(实际上我已经做到了) 2)ViewModel获得此结果并将其转换为网格上的位置(有一些想法) 3)视图必须以某种方式获得该位置并移动我的播放器。

2 个答案:

答案 0 :(得分:-1)

谢谢MarkFeldman!您的方法对我有所帮助。但是我现在有另一个问题))

此刻,我的玩家可以在游戏板上四处移动。这很棒!但是,我想一次一张地模拟纸牌的通过,而不是立即模拟到最后一张纸牌。首先,我尝试迈出第一步,thread.sleep(100),然后再次迈出正确的一步。但这导致程序完全冻结,直到芯片插入最终卡。

我将再感谢一个提示。

答案 1 :(得分:-1)

    internal void MakeStep()
    {
        this.CardIndex++;
    }

    internal void MakeStep(int count)
    {
        Task.Factory.StartNew(() => this.StepByStep(count));

    }

    private void StepByStep(int count)
    {
        for (int i = count; i > 0; i--)
        {
            System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                this.MakeStep();
                Debug.Print(this.CardIndex.ToString());
            }), DispatcherPriority.Background);
            Thread.Sleep(100);
        }
    }

这是我用于逐张模拟纸牌通过的解决方案。问题出在线程中!