programing

CheckBox를 내용에 맞추려면 어떻게 해야 합니까?

sourcejob 2023. 4. 29. 09:15
반응형

CheckBox를 내용에 맞추려면 어떻게 해야 합니까?

WPF CheckBox 모양은 확인 부분을 레이블(내용) 부분과 잘못 정렬합니다.검사는 다음과 같이 내용보다 약간 위에 있습니다.

여기에 이미지 설명 입력

XAML은 다음과 같습니다.

<CheckBox Content="Poorly aligned CheckBox" Margin="9"/>

CheckBox는 그리드 셀 안에 있습니다.XAML CheckBox의 내용을 세로로 정렬하고 확인하는 간단한 방법이 있습니까?저는 여러 가지 속성 조합을 시도해 보았지만 실패했습니다.여기서 비슷한 질문을 봤는데 답이 너무 복잡합니다.

잘 부탁드립니다.

EDIT: 문제는 제가 14로 설정한 Window Font Size 때문에 발생했습니다.문제를 다시 만들려면 CheckBox FontSize를 14(또는 그 이상)으로 설정합니다.제 프로그램은 공장 직원들이 멀리서 보기 때문에 사용자가 윈도우 글꼴 크기를 늘리거나 줄일 수 있습니다.

너무 늦은 건 알지만 마진을 설정하지 않고 더 나은 해결책이 있습니다.마진은 높이에 따라 다르게 설정해야 합니다.TextBlock또는Checkbox.

<CheckBox VerticalAlignment="Center" VerticalContentAlignment="Center">
    <TextBlock Text="Well aligned Checkbox" VerticalAlignment="Center" />
</CheckBox>

업데이트:

아래 @nmarler의 코멘트를 확인해 볼 가치가 있습니다.

편집 - 답변: (이전에는 좋지 않았습니다)

제가 생각하는 최선의 방법은 아니지만, 그 일을 할 수 있습니다.

<CheckBox>
    <TextBlock Text="Poorly aligned CheckBox" Margin="0,-2,0,0"/>
</CheckBox>

마이너스 마진을 사용하여 콘텐츠를 밀어 올리면 다음과 같은 결과를 얻을 수 있습니다.여기에 이미지 설명 입력

CheckBoxWPF에서는 그렇게 보이지 않습니다.XP와 Windows 7 모두에서 완벽하게 조정됩니다.이 문제를 재현하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까?

지금 보고 계신 오프셋을 얻기 위해 제가 생각할 수 있는 두 가지는 두 가지 중 하나입니다.Padding 는또.VerticalContentAlignment은 " " 입니다.CheckBox 한 치 가 대의 값입니다.VerticalContentAlignment이라Top a 리고a.CheckBox와 함께Content가지다Padding로 설정한."4,0,0,0"이 두 가지를 바꾸어서 어떤 차이가 있는지 확인해 보십시오.

여기 비교가 있습니다.

여기에 이미지 설명 입력

다음의 Xaml로부터.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <CheckBox Grid.Row="0"
              Content="Poorly aligned CheckBox" Margin="9" />
    <CheckBox Grid.Row="1"
              Content="Padding=4,4,0,0" Margin="9" Padding="4,4,0,0"/>
    <CheckBox Grid.Row="2"
              Content="Vertical Center" Margin="9"
              VerticalContentAlignment="Center"/>
    <CheckBox Grid.Row="3"
              Content="Vertical Top" Margin="9"
              VerticalContentAlignment="Top"/>
</Grid>

내용에 대한 텍스트 블록을 만들 필요도 없고 필요 없는 추가 코드를 작성할 필요도 없는 간단한 해결 방법이 있습니다."수직 내용 정렬"을 사용하면 됩니다.예:

<CheckBox Content="Sample of Text" VerticalContentAlignment="Center"/>

수평 방향의 스택 패널에 빈 CheckBox와 내용을 별도의 컨트롤로 배치합니다.모든 글꼴 크기에서 작동합니다.

<StackPanel Orientation="Horizontal">
    <CheckBox VerticalAlignment="Center" />
    <TextBlock VerticalAlignment="Center" Text="Option X" />
</StackPanel />

음의 상단 패딩을 적용하는 것은 내 레이아웃에 딱 맞습니다.

<CheckBox Content="Poorly aligned CheckBox" Padding="4,-3,0,0" Margin="9"/>

제 체크박스는 잘 정렬되어 있는데, 당신의 체크박스는 무엇이 다른지 궁금합니다.유일한 분명한 차이점은 당신이 나보다 더 큰 글꼴을 사용하고 있다는 것이며, 이는 다음 질문을 떠올리게 합니다.

텍스트 래핑이 있는 WPF CheckBox

내용이 텍스트 블록인 경우 확인란이 최상위 맞춤으로 표시되어 글꼴 크기를 늘렸을 때 이상하게 보일 수 있습니다.액세스 권한을 사용해 보십시오.대신 CheckBox의 내용으로 텍스트:

<CheckBox Margin="9"><AccessText>Better aligned CheckBox?</AccessText></CheckBox>

ControlTemplate TargetType="{x:CheckBox}"를 입력합니다. "폭=13 높이=13"이 표시됩니다. 여백="0,4,0,0"(왼쪽,위,오른쪽,아래)에 추가하고 원하는 결과를 얻을 수 있도록 조정합니다.CheckBox와 Glyph Size를 확대한 후 여백으로 다시 정렬했습니다.전체 템플릿은 다음과 같습니다.

<Style x:Key="{x:Type CheckBox}"
   TargetType="{x:Type CheckBox}">
    <Setter Property="SnapsToDevicePixels"
      Value="true" />
    <Setter Property="OverridesDefaultStyle"
      Value="true" />
    <Setter Property="FocusVisualStyle"
      Value="{DynamicResource CheckBoxFocusVisual}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
                <BulletDecorator Background="Transparent">
                    <BulletDecorator.Bullet>
                        <!--Width=13 Height=13 CornerRadius=0-->
                        <Border x:Name="Border"
                Width="15"
                Height="15"
                Margin="0,4,0,0"
                CornerRadius="1"
                BorderThickness="1">
                            <Border.BorderBrush>
                                <LinearGradientBrush StartPoint="0,0"
                                 EndPoint="0,1">
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStopCollection>
                                            <GradientStop Color="{DynamicResource BorderLightColor}"
                                Offset="0.0" />
                                            <GradientStop Color="{DynamicResource BorderDarkColor}"
                                Offset="1.0" />
                                        </GradientStopCollection>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0,0"
                                 EndPoint="0,1">
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStopCollection>
                                            <GradientStop Color="{DynamicResource ControlLightColor}" />
                                            <GradientStop Color="{DynamicResource ControlMediumColor}"
                                Offset="1.0" />
                                        </GradientStopCollection>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>

                            </Border.Background>
                            <Grid>
                                <!--Width=7 Height=7-->
                                <Path Visibility="Collapsed"
                  Width="8"
                  Height="8"
                  Margin="0,0,0,0"
                  x:Name="CheckMark"
                  SnapsToDevicePixels="False"
                  StrokeThickness="2"
                  Data="M 0 0 L 7 7 M 0 7 L 7 0">
                                    <Path.Stroke>
                                        <SolidColorBrush Color="{DynamicResource GlyphColor}" />
                                    </Path.Stroke>
                                </Path>
                                <Path Visibility="Collapsed"
                  Width="8"
                  Height="8"
                  Margin="0,0,0,0"
                  x:Name="InderminateMark"
                  SnapsToDevicePixels="False"
                  StrokeThickness="2"
                  Data="M 0 7 L 7 0">
                                    <Path.Stroke>
                                        <SolidColorBrush Color="{DynamicResource GlyphColor}" />
                                    </Path.Stroke>
                                </Path>
                            </Grid>
                        </Border>
                    </BulletDecorator.Bullet>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Panel.Background).
                  (GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource ControlMouseOverColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Panel.Background).
                  (GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource ControlPressedColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Border.BorderBrush).
                  (GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource PressedBorderDarkColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Border.BorderBrush).
                  (GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource PressedBorderLightColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled" />
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="CheckStates">
                            <VisualState x:Name="Checked">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                             Storyboard.TargetName="CheckMark">
                                        <DiscreteObjectKeyFrame KeyTime="0"
                                        Value="{x:Static Visibility.Visible}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unchecked" />
                            <VisualState x:Name="Indeterminate">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)"
                                             Storyboard.TargetName="InderminateMark">
                                        <DiscreteObjectKeyFrame KeyTime="0"
                                        Value="{x:Static Visibility.Visible}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <!--4,0,0,0-->
                    <ContentPresenter Margin="5,0,0,0"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Left"
                        RecognizesAccessKey="True" />
                </BulletDecorator>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

언급URL : https://stackoverflow.com/questions/7232434/how-can-i-align-a-checkbox-with-its-content

반응형