

下記のコーディングで画面遷移しているのですが、`window.Hide()`をしてから遷移しますので、  
今のwindowが隠れる為に、なにもない状態となって、次に遷移先のwindowが開きます。  
よってちらつきが発生してしまいます。  
ちらつきの回避と思って`window.Hide()`を画面遷移後(`Messenger.Raise()`の後)にすると  
制御が戻っていない為に、遷移元のwindowも残ってしまいます。  
遷移元のwindowが残らずに画面遷移する方法を教えて下さい。

[code]

    // 現在の View のインスタンスを取得
    var window = Application.Current.Windows.OfType<Window>().SingleOrDefault((w) => w.IsActive);
    try
    {
           // 現在の View を非表示
           window.Hide();
           // View にメッセージを送信～子画面をモーダルで起動
          Messenger.Raise(new TransitionMessage(new 
                     ViewModel2(),ShowCommand2"));   
    }
    finally
    {
          // View を再表示する
          window.ShowDialog();
    }
    
[/code]


CC BY-SA 3.0
2015-09-11T07:00:50.097
16513
2016-01-15T08:37:50.800
2015-09-11T09:00:12.180
8000
5735
question
c# wpf
Livetでの画面遷移でちらつかない方法


本来は単一ウィンドウで画面遷移したいという事でしょうか。

それならば、 `ContentControl` を使うとDataContextにセットされたデータ型に応じて表示(View)を変えることが可能です。

以下は、Window.DataContextに連動してContentControlのViewを変えるサンプルです。

MainWindow.Xaml の Content部分

[code]

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <Button Content="ViewModel1" Click="Button1_Click"/>
            <Button Content="ViewModel2" Click="Button2_Click" Margin="10,0,0,0"/>
        </StackPanel>
    
        <!-- Window.DataContextとContentControl.DataContextを同期 -->
        <ContentControl Grid.Row="1" Content="{Binding}">
            <ContentControl.Resources>
                <!-- 中身がViewModel1の時のView定義 -->
                <DataTemplate DataType="{x:Type vm:ViewModel1}">
                    <Label Content="ViewModel1" Background="PaleGreen"/>
                </DataTemplate>
                <!-- 中身がViewModel2の時のView定義 -->
                <DataTemplate DataType="{x:Type vm:ViewModel2}">
                    <Label Content="ViewModel2" Background="PaleVioletRed"/>
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>
    </Grid>
    
[/code]

MainWindow.Xaml.cs

[code]

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            DataContext = new ViewModel1();
        }
    
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            DataContext = new ViewModel2();
        }
    }
    
[/code]


CC BY-SA 3.0
2015-09-17T05:57:40.920
16701
2015-09-17T05:57:40.920
3022
16513
answer