Изменение стиля окна во время выполнения работало на VS2008, не работает на VS2010 - PullRequest
1 голос
/ 15 сентября 2011

То, что работало на VS2008 (framework 3.5), похоже, не работает на VS2010 (framework 4).

Мне нужно изменить стиль окна во время выполнения (предпочтения пользователя). В VS2008 этот код работал:

Window1.xaml

<Window x:Class="StyleTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        ResizeMode="CanResizeWithGrip">

  <Window.Style>
    <Style TargetType="{x:Type Window}">
      <Setter Property="MinWidth" Value="400" />
      <Setter Property="Width" Value="500" />
      <Setter Property="MinHeight" Value="400" />
      <Setter Property="SizeToContent" Value="Height" />
    </Style>
  </Window.Style>

  <Grid>

  </Grid>
</Window>

Window1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Windows.Markup;
using System.IO;

namespace StyleTest
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();

      Loaded += new RoutedEventHandler(ObjDialog_Loaded);
    }

    void ObjDialog_Loaded(object sender, RoutedEventArgs e)
    {
      XmlDocumentFragment frag = new XmlDocument().CreateDocumentFragment();
      frag.InnerXml = "<Style TargetType=\"{x:Type Window}\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"> " +
                      "  <Setter Property=\"Height\" Value=\"200\" />" +
                      "  <Setter Property=\"Width\" Value=\"200\" />" +
                      "</Style>";
      XmlNode node = frag.FirstChild as XmlElement;

      Style style = LoadXaml(node.OuterXml) as Style;
      if (style != null)
        Style = style;

      UpdateLayout();
    }

    private object LoadXaml(string xaml)
    {
      Exception ex = null;
      object o = LoadXaml(xaml, out ex);

      if (ex != null)
        throw ex;

      return o;
    }

    public static object LoadXaml(string xaml, out Exception exception)
    {
      try {
        ParserContext pc = new ParserContext();
        pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
        pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
        pc.XmlnsDictionary.Add("l", "http://www.teradp.com/schemas/GN4/1/WinUI");
        pc.XmlnsDictionary.Add("c", "clr-namespace:TeraDP.GN4.Common;assembly=Common");

        exception = null;
        return XamlReader.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), pc);
      }
      catch (Exception ex) {
        exception = ex;
      }

      return null;
    }

  }
}

Когда я запускаю этот код в Framework 3.5, отображается окно с размером 200x200. Когда я запускаю этот код на Framework 4 thw, отображается окно размером 500x400

Самое странное, что если я добавлю MinWidth и MinHeight к стилю, применяемому во время выполнения, эти атрибуты будут работать правильно и в VS2010, тогда как Width и Height, похоже, будут игнорироваться.

У кого-нибудь есть решение этой проблемы?

1 Ответ

0 голосов
/ 15 сентября 2011

AFAIK, чтобы изменить способ отображения окна и / или его размер, который вы должны просто реализовать ArrangeOverride ИЛИ установить Height и Width напрямую (например, в дескрипторе события Loaded) ...

РЕДАКТИРОВАТЬ - согласно комментарию:

Применение XAML во время выполнения может открыть несколько проблем безопасности, поэтому я бы порекомендовал этого не делать или, по крайней мере, предпринять некоторые меры безопасности, чтобы не дать динамически загруженному XAML связываться с приложением ... при этом сказано:

Эта запись MS Connect не совсем та же проблема, но как-то связана и предполагает, что в WPF 4 может быть ошибка.

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