Отображается время в навигации (фрейм) с флажком - PullRequest
0 голосов
/ 07 сентября 2011

Я усердно работаю над собственной анимацией перехода в Frame.Но следующая загадочная проблема нанесла мне смертельный смертельный урон.

Во-первых, вот примерное окно.Он состоит из одного кадра и одной кнопки.Конечно, он отличается от моего проекта ствола, тем не менее, он все еще показал ту же проблему.

enter image description here

Когда я нажимаю кнопку, рамка переходит к Page1.

enter image description here

РЕДАКТИРОВАНИЕ: здесь находится исходное состояние Page1.Это было сделано в VS2010 IDE.

enter image description here

Итак, в чем проблема?- проблема возникает, когда я звоню RenderToBitmap(), чтобы получить изображение страницы назначения.(В этом случае пункт назначения - Page1.)

Я звоню RenderToBitmap() со следующим кодом.Вот весь код MainWindow.

public partial class MainWindow : Window
{
    public MainWindow() { InitializeComponent(); }

    Page1 pg1 = new Page1();
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.frame.Navigate(pg1); //start to navigate.
    }

    private void frame_Navigated(object sender, NavigationEventArgs e)
    {
        //SaveVisualToPng is my own static method.
        WPFHelper.SaveVisualToPng("d:\\a.png", pg1);
    }
}

И, наконец, визуальное состояние, когда вызывается frame_Navigated.TextBox и TextBlock визуализируются, а CheckBox и RadioButton также визуализируются.Как ни странно, но проверенное состояние CheckBox и RadioButtons (изображение надреза и эллипса) еще не отрисовано.

enter image description here

Как я могу решить эту поддельную проблему?Конечно, это очень немного вещей.Но я думаю, что эта часть является основой моего приложения, поэтому я хочу сделать безупречно.

EDITED (2) Вот источник SaveVisualToPng ().Первоначально он содержит несколько методов, помогающих работать, например, GetDPI, но я его опускал.Вместо этого следующий код дает тот же результат.

public static class WPFHelper
{

    public static void SaveVisualToPng(string path, Visual v)
    {
        int width = Convert.ToInt32(((FrameworkElement)v).ActualWidth);
        int height = Convert.ToInt32(((FrameworkElement)v).ActualHeight);

        RenderTargetBitmap myBmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        myBmp.Render(v);

        if (myBmp != null)
        {
            PngBitmapEncoder png = new PngBitmapEncoder();
            png.Frames.Add(BitmapFrame.Create(myBmp));
            using (Stream stm = System.IO.File.Create(path))
            {
                png.Save(stm);
            }
        }
    }

}

1 Ответ

1 голос
/ 07 сентября 2011

Посмотрите, поможет ли постановка в очередь вашей работы с диспетчером (чтобы дать WPF время для визуализации элементов управления):

private void frame_Navigated(object sender, NavigationEventArgs e) 
{ 
    Action save = () => WPFHelper.SaveVisualToPng("d:\\a.png", pg1); 
    Dispatcher.BeginInvoke(DispatcherPriority.Background, save);
} 

Без вашей WPFHelper реализации я не могу проверить это, но стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...