Загрузка XAML во времени выполнения?

119 Я лично нахожу это легче понять, так как он ближе к версии «множественного числа»: для каждого «a» в «aList» мы создаем новую последовательность - в этом случае это всегда «bList». Для каждой пары (a, b), полученной декартовым объединением, мы проецируем на результат, который является просто объединением двух.

1111 Просто чтобы прояснить: оба подхода будут работать. Я просто предпочитаю это:)

Относительно того, понятнее ли это, чем синтаксис выражения запроса ... Я не уверен. Я обычно использую вызовы методов, когда это просто случай использования одного оператора, но для Join, GroupJoin, SelectMany и GroupBy выражения запросов действительно упрощают вещи. Попробуйте оба варианта и посмотрите, какие вы найдете более читабельными:)

46
задан djcouchycouch 26 May 2009 в 14:44
поделиться

4 ответа

Я думаю, что это довольно просто с XamlReader, попробуйте, сам не пробовал, но я думаю, что это должно работать.

http: //blogs.msdn. com / ashish / archive / 2007/08/14 / dynamic-loading-xaml.aspx

17
ответ дан 26 November 2019 в 20:33
поделиться

Как заметил Якоб Кристенсен, вы можете загрузить любой XAML, который хотите, используя XamlReader.Load . Это относится не только к стилям, но и к элементам UIElement . Вы просто загружаете XAML, например:

UIElement rootElement;
FileStream s = new FileStream(fileName, FileMode.Open);
rootElement = (UIElement)XamlReader.Load(s);
s.Close();

Затем вы можете установить его как содержимое подходящего элемента, например, для

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Foo Bar">
    <Grid x:Name="layoutGrid">
        <!-- any static elements you might have -->
    </Grid>
</Window>

вы можете добавить rootElement в сетку с помощью:

layoutGrid.Children.Add(rootElement);
layoutGrid.SetColumn(rootElement, COLUMN);
layoutGrid.SetRow(rootElement, ROW);

Естественно, вам также придется вручную подключать любые события для элементов внутри rootElement в коде программной части. В качестве примера предположим, что ваш rootElement содержит Canvas с набором Path s, вы можете назначить Path s ' MouseLeftButtonDown вроде этого:

Canvas canvas = (Canvas)LogicalTreeHelper.FindLogicalNode(rootElement, "canvas1");
foreach (UIElement ui in LogicalTreeHelper.GetChildren(canvas)) {
    System.Windows.Shapes.Path path = ui as System.Windows.Shapes.Path;
    if (path != null) {
        path.MouseLeftButtonDown += this.LeftButtonDown;
    }
}

Я не пробовал переключать файлы XAML на лету,

36
ответ дан 26 November 2019 в 20:33
поделиться

Вы можете загрузить любой XAML, который хотите, используя XamlReader.Load .

Если вы стилизуете все элементы управления в своем приложении и определяете эти стили в словаре ресурсов приложения, вы можете загружать новые стили, определенные в XAML, где-нибудь еще с помощью XamlReader.Load и заменять части словаря ресурсов загруженным XAML. Внешний вид ваших элементов управления изменится соответствующим образом.

5
ответ дан 26 November 2019 в 20:33
поделиться

Посмотрите http://www.codeproject.com/Articles/19782/Creating-a-Skinned-User-Interface-in-WPF - Джош Смит написал отличная статья о том, как сделать скиннинг в WPF.

0
ответ дан 26 November 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: