Интерфейс Splitting WPF через несколько файлов Xaml

(см. историю этого ответа, чтобы получить более сложный текст, но теперь я думаю, что читателю легче увидеть реальные командные строки).


Общие файлы, общие для всех команд ниже

$ cat a.cpp
extern int a;
int main() {
  return a;
}

$ cat b.cpp
extern int b;
int a = b;

$ cat d.cpp
int b;

Связывание со статическими библиотеками

$ g++ -c b.cpp -o b.o
$ ar cr libb.a b.o
$ g++ -c d.cpp -o d.o
$ ar cr libd.a d.o

$ g++ -L. -ld -lb a.cpp # wrong order
$ g++ -L. -lb -ld a.cpp # wrong order
$ g++ a.cpp -L. -ld -lb # wrong order
$ g++ a.cpp -L. -lb -ld # right order

Компонент выполняет поиск слева направо и отмечает неразрешенные символы. Если библиотека разрешает символ, он принимает объектные файлы этой библиотеки для разрешения символа (b.o из libb.a в этом случае).

Зависимости статических библиотек друг от друга работают одинаково - библиотека, которая нуждается в символах, должна быть первой, а затем библиотекой, которая разрешает символ.

Если статическая библиотека зависит от другой библиотеки , но другая библиотека снова зависит от прежней библиотеки, есть цикл. Вы можете разрешить это, включив циклически зависимые библиотеки с помощью -( и -), например -( -la -lb -) (вам может понадобиться избежать появления парсеров, таких как -\( и -\)). Затем компоновщик выполняет поиск вложенных библиотек несколько раз, чтобы гарантировать, что зависания на велосипеде разрешены. Кроме того, вы можете указывать библиотеки несколько раз, поэтому каждый из них находится друг перед другом: -la -lb -la.

Связывание с динамическими библиотеками

$ export LD_LIBRARY_PATH=. # not needed if libs go to /usr/lib etc
$ g++ -fpic -shared d.cpp -o libd.so
$ g++ -fpic -shared b.cpp -L. -ld -o libb.so # specifies its dependency!

$ g++ -L. -lb a.cpp # wrong order (works on some distributions)
$ g++ -Wl,--as-needed -L. -lb a.cpp # wrong order
$ g++ -Wl,--as-needed a.cpp -L. -lb # right order

Здесь то же самое - библиотеки должны следуйте объектным файлам программы. Разница здесь в статических библиотеках заключается в том, что вы не должны заботиться о зависимостях библиотек друг от друга, потому что динамические библиотеки сами сортируют свои зависимости .

Некоторые недавние дистрибутивы, по-видимому, по умолчанию используют флаг компоновщика --as-needed, который обеспечивает, чтобы объектные файлы программы приходили перед динамическими библиотеками. Если этот флаг передан, компоновщик не будет ссылаться на библиотеки, которые фактически не нужны исполняемому файлу (и он обнаруживает это слева направо). Мой недавний дистрибутив archlinux по умолчанию не использует этот флаг, поэтому он не дал ошибку, чтобы не следовать правильному порядку.

Неправильно пропустить зависимость b.so от d.so при создании первого. При связывании a вам потребуется указать библиотеку, но a действительно не нуждается в самом целочисленном b, поэтому не следует заботиться о собственных зависимостях b.

Вот пример последствий, если вы пропустили определение зависимостей для libb.so

$ export LD_LIBRARY_PATH=. # not needed if libs go to /usr/lib etc
$ g++ -fpic -shared d.cpp -o libd.so
$ g++ -fpic -shared b.cpp -o libb.so # wrong (but links)

$ g++ -L. -lb a.cpp # wrong, as above
$ g++ -Wl,--as-needed -L. -lb a.cpp # wrong, as above
$ g++ a.cpp -L. -lb # wrong, missing libd.so
$ g++ a.cpp -L. -ld -lb # wrong order (works on some distributions)
$ g++ -Wl,--as-needed a.cpp -L. -ld -lb # wrong order (like static libs)
$ g++ -Wl,--as-needed a.cpp -L. -lb -ld # "right"

. Если теперь вы посмотрите на зависимости, которые имеет двоичный файл, вы заметите сам бинарный файл зависит также от libd, а не только от libb. Бинарный файл нужно будет перемотать, если позже libb зависит от другой библиотеки, если вы сделаете это так. И если кто-то загружает libb, используя dlopen во время выполнения (подумайте о загрузке плагинов динамически), вызов также не удастся. Поэтому "right" действительно должен быть wrong.

47
задан Dave Turvey 22 October 2008 в 07:38
поделиться

3 ответа

Можно разделить большой пользовательский интерфейс путем определения UserControls.

Щелкают правой кнопкой по дереву решения, выбирают Add-> New Item... тогда Пользовательский элемент управления. Можно разработать это нормальным способом.

можно тогда сослаться usercontrol в XAML использование объявления пространства имен. Скажем, Вы хотите включать свой UserControl в Окно. В следующем примере я добавил UserControl под названием "Нечто" к пространству имен "YourCompany. Средства управления":

<Window x:Class="YourCompany.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:YourCompany.Controls">

  <Controls:Foo ... />

Для Вашего определенного примера, Вы использовали бы свой usercontrol в поле комбинированного списка путем определения DataTemplate, который отобразил данные в usercontrol.

42
ответ дан stusmith 7 November 2019 в 23:29
поделиться

Можно разделить файлы XAML при помощи ResourceDictionary. ResourceDictionary может использоваться для слияния других файлов:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

В ResourceDictionary, можно также объявить Стили, которые можно использовать в элементах, таких, что основной файл XAML становится меньшим.

Другая возможность получить меньший файл XAML состоит в том, чтобы определить Ваши собственные средства управления, которые Вы тогда используете в своем главном приложении.

23
ответ дан EFrank 7 November 2019 в 23:29
поделиться

Используйте стили и пользовательские элементы управления. Разделите свой интерфейс на меньших частях и кодируйте их в другом xaml файлы. Пример:

<Window>
<VeryBigControl>
<VeryBigControl.Style>
... <!--very long style-->
</VeryBigControl.Style>
.. <!--content of very big control-->
</VeryBigControl
</Window>

делят его на три xaml файла:
Window.xaml - это будет Окном
VeryBigControl.xaml - это будет UserControl
VeryBigControlStyle.xaml - это будет словарем ресурса
и так далее:)

-1
ответ дан Andrey Neverov 7 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

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