Каково различие между x:Key и x:Name?

В WPF: каково различие между x:Key и x:Name? В каких случаях нужно использовать одну или другую?

Я знаю, что x:Key смоги быть seteado с одной markup-extension так:

x:Key="{x:Static local:MisKeys.MiKey}"

Но x:Name нет. Почему это это? Он мне не нравится hardcodear strings и с x:Name я оказываюсь вынужденной это делать.

Я хотел бы знать, "взаимозаменяемые" ли оба свойства в каком-то контексте, потому что я предпочитаю использовать x:Key все возможное, так как я она могу setear с постоянной величиной.

6
задан 15.12.2015, 16:29
3 ответа

x.Key это свойство статьи внутри одного ResourceDictionary. Он использован, чтобы идентифицировать ресурс внутри словаря ресурсов.

Взамен x:Name это идентификатор в C#, что соответствует этикетке XAML, в которую добавляют он x:Name, таким образом он такой, как ты можешь снабжать ссылками это с C#.

С этим примером я надеюсь, что все остается ясным:

XAML

<Window x:Class="WpfApplication1.MainWindow" ...
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="NameDelGrid">
        <Grid.Resources>
            <SolidColorBrush x:Key="KeyDelBrush" Color="White"/>
        </Grid.Resources>
    </Grid>
</Window>

C#

    public MainWindow()
    {
        InitializeComponent();

        Grid grid = NameDelGrid; // NameDelGrid es un identificador C#
        SolidColorBrush resource = (SolidColorBrush)grid.Resources["KeyDelBrush"]; // KeyDelBrush es un string que identifica al resource dentro del ResourceDictionary
        string color = resource.Color.ToString();
        MessageBox.Show(color);
    }

В этом примере появляется в MessageBox стоимость #FFFFFFFF что соответствует белому цвету.

Поскольку ты можешь наблюдать NameDelGrid это имя поля, которое принадлежит ему в MainWindow, это не стоимость, которая могла бы быть измененной dinámicamente но это имя свойства класса.

4
ответ дан 24.11.2019, 15:06
  • 1
    Я не хочу изменить это dinamicamente, скорее только хочу распределить ему постоянную величину. Потому что, когда снопы CustomControls ты нуждаешься в том, чтобы искать статьи по имени, и у тебя не остается другая, который писать имя элемента снова. Равный я понимаю твою точку, и тот факт, что я упоминаю наверху о JuanK. – Dzyann 17.12.2015, 19:21

x:Key используется, чтобы идентифицировать объекты в словаре ресурсов:

<Grid>
    <Grid.Resources>
        <Style x:Key="ElEstilo" />
    </Grid.Resources>
    <Button Style="{StaticResource ElEstilo}" />
</Grid>

x:Name используется, чтобы идентифицировать элементы интерфейса пользователя:

<TextBox x:Key="ElTextBox" />

Ты Можешь aГ±adir один x:Name в ресурс, но не можешь использовать Вашу стоимость это снабжать ссылками с StaticResource. Ты не можешь использовать x:Key вне словаря ресурсов.

2
ответ дан 24.11.2019, 15:06
  • 1
    Костлявая, что не являются взаимозаменяемыми ни в каком контексте? И нет способа не иметь, что hardcodear стоимость x:Name? – Dzyann 15.12.2015, 15:07
  • 2
    не est и # 225; hardcodeado, b и # 225; sicamente он est и # 225; s помещая имя в переменную. – JuanK 15.12.2015, 15:38
  • 3
    @JuanK - я не сообщаю себе твой ответ. Если этот hardcodeado, потому что, если он нуждался в том, чтобы снабдить ссылками ее с другой стороны, я не могу если только не напишет снова тот же string, что он может производить в ошибках. – Dzyann 17.12.2015, 19:20

Хороший я занимаю холодное время с XAML (но обычно была очень хорошей скромность в абзац)

Достаточно помещать Name и помечать доступ к texbox как public для того, чтобы ты это смог соглашаться как член инстанции снаружи той же самой.

Использование Name даже, если ты должен писать это всегда как string всегда это будет альтернатива, которую будет нужно продолжать, чтобы соглашаться на дерево объектов UI внутри XAML.

Ты hardcodeando совсем не

Платформа была разработана так. Чтобы соглашаться на объект внутри 'DOM' xaml ты должен переходить с одного сайта на другой через сложную иерархию объектов, и когда UI достаточно богатая, поворачивается тема угадывания в каком объекте иерархии эти.

Чтобы предотвращать это тогда ты можешь идентифицировать объекты по Вашему имени, если у тебя есть все, очень хорошо собранное с MVVM, редко ты будешь нуждаться это, потому что binding возьмется за то, чтобы решать необходимое, однако всегда найдешь сцену, где binding сам не достаточно, чтобы решать все (иногда он состоит в том, что ты не такой хороший с MVVM как веришь, но это другая тема). В этих случаях ты должен искать самый подходящий способ работать с какой-то / вы объекты иерархии, и самая простая форма - по имени.

Когда у объекта есть имя, ты это можешь соглашаться прямо с code behind, и если ты требуешь соглашаться на этот снаружи класса, где он определен тогда, ты это помечаешь как public.

Porqué Name

Объект, определенный внутри XAML - только field/property внутри класса, только, который ты не определяешь с кодом программирования а с этикетками. Если ты захочешь использовать этот field/property тогда, ты будешь должен помещать ему имя.

Помещать ему Ямс в объект также полезно для каких-то сцен binding, где binding объекта связан с другого.

Binding

Например у тебя есть один Slider и ты хочешь, чтобы стоимость slider изменила матовость объекта Image в этом случае ты должен делать, что свойство Opacity Image сделайте binding со свойством Value Slider... и нет способа это делать честно, а распределяя его Name в Slider.

Креативность

Я не хочу изменить это dinámicamente, скорее только хочу распределить ему постоянную величину. Потому что, когда снопы CustomControls ты нуждаешься в том, чтобы искать статьи по имени, и у тебя не остается другая, который писать имя элемента снова.

Помни, что XAML одинокий половина частичного класса, другая половина - конечно code behind.

Если у тебя хочет быть способ соглашаться быстро на объект твоего UI, ты смог бы тогда называть это и выставлять это как publicа именно свойство внутри твоего класса, также в в codebehind ты можешь герметизировать в корпусе форму, в которой ты соглашаешься на Ваши свойства, и выставлять только то, что ты желаешь как публичные свойства.

Иногда я был должен позволять, что специфический obejeto был соглашен глобально, в этом случае то, что я делаю, состоит в том, чтобы манипулировать статическим классом во всем app, где снабжать ссылками какие-то объекты, доступ которых важен, и я берусь за то, чтобы распределять вышеупомянутые статические поля с соответствующей инстанцией с codebehind XAML, примера

public void Loaded(...)
{
   StaticResourceSharer.TheTextBlock = this.MiTextBlock;
}

Покажись простым, но он это не, в способе могут быть истинные ночные кошмары, но для основных случаев всегда моги быть выводом, чтобы менять какое-то специфическое свойство UI и т.д.... конечно каждый раз, когда ты прибыл в эту сцену ты должен осознавать, что твоя стратегия binding неполная, и ты не манипулируешь состоянием каких-то вещей, которые были бы должны делать часть модели (ViewModel).

И Key

key, поскольку хорошо ты это сказали звук описывающие объекта в группе ресурсов, если ты думаешь о группе ресурсов этот, это только коллекция объектов, которые я хочу использовать в определенной сцене. Это не случайность, что, что назвали Словарями, потому что в финале это они, словари, очень похожие на один Dictionary<string, object коллекция, где ты можешь соглашаться на Ваши объекты используя ключ, который делает разы индекса.

Ты определяешь key, когда у тебя есть объект, что ты это хочешь согласиться как ресурс, например:

  • Графический стиль, определенный для твоих textblocks
  • datasource, который ты это хочешь использовать потом как datacontext / viewmodel в одном или нескольком объектах
0
ответ дан 24.11.2019, 15:06
  • 1
    Спасибо Хуан из-за твоего ответа. Уже, что платформа сделана такой, это не означает, что это добро. Тот факт, что Ямс должен был быть string, с формой, в которой функционируют Кустом Контрольс, он способствует тому, чтобы ты был должен писать два раза тот же текст (имя контроля) как минимум, что беспокоит меня, потому что он может вызывать ошибки в будущее, и кроме того случайно ты можешь менять имя на сторону и составив, он не будет не удаваться. Поэтому дело в том, что он спрашивал, если кто-то знал о какой-то форме, в которой было возможно бы помещать Ямс в единственное место. – Dzyann 25.12.2015, 03:18
  • 2
    Но я не понимаю тебя. Ямс - одинокий string в XAML, для класса это общий и текущий field, я не вижу, где ты должен определять это 2 раза. Для программы это field, что ты можешь соглашаться, откуда ты хотел согласно ограничениям доступа, чтобы ты сами выставил. Включенный VS может делать тебе intellisense как на уровне Коде Беинд, так и на уровне XAML. Я думаю, что ты задыхаешься в стакане с водой, а именно думаю, что ты ходишь с проблемой, которая не существует. – JuanK 25.12.2015, 03:33
  • 3
    JuanK, hm, я думаю, что ты, может быть, не работал с CustomControls? Это не UserControl, о котором я говорю. У CustomControl нет Code-behind и xaml компаньоны, скорее они отделены. К контролю применяется ControlTemplate, который ты определил бы, используется для theming и extensibilidad. Здесь ты можешь видеть Ямсом эту в xaml, и после в коде контроля tenes, которого делать GetTemplatedChild (" NombreDelControl"), чтобы мочь соглашаться на контроль. – Dzyann 25.12.2015, 03:38
  • 4
    @Dzyann, Если, я это сделал, но там я иду. Ты нуждаешься в том, чтобы назвать объект, который принадлежит одному и #39; DOM и # 39; обычно сложный. Ты нуждаешься в том, чтобы согласиться на эту инстанцию в особенности тогда только у тебя есть два способа это делать: соглашаться на нее прямо: f и # 225; cil, если уже у тебя есть ссылка на нее во времени compilaci и # 243; n, o искать ее, когда она создана деньги и # 225; micamente, что является случаем, в котором ты должен использовать GetTemplatedChild. – JuanK 25.12.2015, 03:45
  • 5
    А снаружи из-за string или идентификатора qu и # 233; другая форма podr и # 237; схвати искать ее? ни одна, нуждаться и # 237; схвати прямую ссылку на поле, но точно у тебя нет ее, потому что объект создан деньги и # 225; micamente, применившись, сдержись в инстанцию во времени ejecuci и # 243; n. однако я понимаю ты чувствовать, потому что уже pas и # 233; из-за ах и # 237;. Я он очень ходил вокруг темы и действительно он та и #250; nica soluci и # 243; n возможный, хорошо будьте ища из-за string или ища из-за любого другого пойдите доступно. Инстанция не существует во времени compilaci и # 243; n, нужно делать одну b и # 250; squeda деньги и # 225; слюда. – JuanK 25.12.2015, 03:45