Флажок по центру в ячейках UniformGrid в WPF

Я хочу центрировать и растянуть флажок в ячейке UniformGrid.
Я пытался сделать это разными способами:

<UniformGrid>
        <CheckBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" />
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True" />
        <CheckBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True" />

  • Выбранная ячейка (0, 0):

    UniformGrid
  • Выбранная ячейка (1, 0):

    UniformGrid

but it doesn't satisfy me because I want to stretch (just like in cell (0,0)) and center (just like in (1,0)) those checkboxes in their cells simultaneously.

Как мне это сделать?


[изменить 1]

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

[изменить 2]

На самом деле я хочу добавить эти флажки из кода С#, поэтому, если решение, сделанное в XAML, не является «переносимым» на язык С#, это будет не очень полезно.


person patryk.beza    schedule 13.06.2012    source источник
comment
Вы пытаетесь сделать так, чтобы вам не нужно было щелкать маленькую галочку, а вместо этого можно было щелкнуть всю ячейку?   -  person Andy    schedule 13.06.2012
comment
да. Извините, я не объяснил это ясно.   -  person patryk.beza    schedule 13.06.2012


Ответы (2)


Если я использую эту простую разметку со значениями Stretch по умолчанию:

<UniformGrid>
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
</UniformGrid>

Я могу щелкнуть в любом месте каждой ячейки UniformGrid, чтобы установить и снять флажок в этой ячейке.

Функционально это делает то, что вы хотите. если вы хотите изменить внешний вид флажка, вы можете использовать ControlTemplate.

Если вы не хотите изменять размер флажка и просто хотите отцентрировать его визуально, имея возможность щелкнуть ячейку, чтобы проверить ее, вы можете использовать такой шаблон:

<CheckBox>
    <CheckBox.Template>
        <ControlTemplate TargetType="{x:Type CheckBox}">
            <Grid Background="Transparent">
                <CheckBox IsChecked="{TemplateBinding Property=IsChecked}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
        </ControlTemplate>
    </CheckBox.Template>
</CheckBox>

ИЗМЕНИТЬ:

Чтобы применить его в качестве ресурса во время выполнения, напишите XAML в разделе ресурсов соответствующей области. Вы можете поместить его в локальный словарь Resources, если он вам нужен только в одном элементе управления, или, если вы хотите получить к нему глобальный доступ, поместите его в App.xaml следующим образом:

<Application.Resources>
    <ControlTemplate x:Key="StretchedCheckBox" TargetType="{x:Type CheckBox}">
        <Grid Background="Transparent">
            <CheckBox IsChecked="{TemplateBinding Property=IsChecked}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
</Application.Resources>

Обратите внимание, что у него есть ключ «StretchedCheckBox». Теперь вы можете использовать это, чтобы применить его в коде:

ControlTemplate stretchedTemplate = FindResource("StretchedCheckBox") as ControlTemplate;

CheckBox chkBox = new CheckBox();
chkBox.Template = stretchedTemplate;
person Trevor Elliott    schedule 13.06.2012
comment
Вам нужно будет x:Null стиль вашего внутреннего флажка, иначе вы получите переполнение стека. - person Andy; 13.06.2012
comment
+1 за шаблон CheckBox, который центрирует CheckBox, но при этом позволяет вам щелкнуть в любом месте сетки, чтобы установить / снять флажок - person Rachel; 13.06.2012
comment
@Andy Andy Как я могу воспроизвести это переполнение стека? Он отлично работает для меня. - person Trevor Elliott; 13.06.2012
comment
Шаблон элемента управления для флажка содержит флажок, поэтому он ищет шаблон элемента управления для флажка... который содержит флажок. Фактическим исключением является бесконечный цикл в ссылках, обнаруженных при обработке шаблона для элемента с именем '' типа 'System.Windows.Controls.CheckBox'. - person Andy; 13.06.2012
comment
Извините, я только что заметил, что вы не установили свой стиль глобально, на самом деле он находится внутри каждого флажка, проблема переполнения, о которой я упоминаю, произойдет только в том случае, если вы определяете один стиль для всех флажков. - person Andy; 13.06.2012
comment
Хорошо, это прекрасно работает, но мне нужно добавить эти флажки из кода C#. Как добавить ControlTemplate в флажок из исходного кода C#? - person patryk.beza; 13.06.2012
comment
Честно говоря, самый простой способ — извлечь ControlTemplate как ресурс и применить его к CheckBox в коде. Я опубликую пример, если вы не знаете, как это сделать. - person Trevor Elliott; 13.06.2012

Я не думаю, что вы можете повлиять на размер CheckBox, потому что размер заранее определен в шаблоне элемента управления.

Одним из решений было бы использование LayoutTransform для увеличения размера CheckBox.

<CheckBox>
    <CheckBox.LayoutTransform>
        <ScaleTransform ScaleX="5" ScaleY="5" />
    </CheckBox.LayoutTransform>
</CheckBox>

Следует отметить, что это масштабирует текст рядом с флажком, а также сам флажок, и иногда это выглядит не очень хорошо в зависимости от того, как вы его масштабируете.

Другое альтернативное решение — скопировать пример шаблона CheckBox из MSDN и создать больше CheckBox

person Rachel    schedule 13.06.2012