Центрирайте квадратчето за отметка в клетките на 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]

Всъщност искам да добавя тези квадратчета за отметка от кода на C#, така че ако решението, направено в XAML, не е „преносимо“ към езика C#, няма да е много полезно.


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 в раздел за ресурси с подходящия обхват. Можете да го поставите в локалния речник на ресурсите, ако имате нужда от него само в една контрола, или ако искате глобален достъп до него, поставете го в 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 за шаблона на квадратчето за отметка, който центрира квадратчето за отметка, като същевременно ви позволява да щракнете навсякъде в мрежата, за да го поставите/премахнете отметката - person Rachel; 13.06.2012
comment
@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.LayoutTransform>
        <ScaleTransform ScaleX="5" ScaleY="5" />
    </CheckBox.LayoutTransform>
</CheckBox>

Трябва да се отбележи, че това мащабира текста до квадратчето за отметка, както и самото квадратче за отметка, и понякога не изглежда много добре в зависимост от това как го мащабирате.

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

person Rachel    schedule 13.06.2012