Wygląd linii w kontrolce Border WPF

0

Witam.
Próbuję ustawić na oknie WPF kilkanaście kontrolek typu Border. Nadaję im na Resource grida na którym je stawiam właściwości, m.in. wygląd linii tak aby pokazywane były tylko lewa i dolna linia każdej kontrolki w zadanym kolorze.
Po uruchomieniu tego okna na każdej kontrolce linia dolna wygląda inaczej (tzn. ma trochę inny kolor). Chciałbym aby te linie wyglądały identycznie. Niektóre linie są szersze niż pozostałe w różnych kolorach (tak jakby program chciał zrobić cieniowanie). Czemu dostaję taki efekt? Pierwszy raz spotykam się z czymś takim.

Czy ktoś mógłby mi wyjaśnić dlaczego?

Poniżej kod xaml i zrzut z ekranu.


<Border Grid.Row="0" BorderBrush="{StaticResource tabBorderBrush}" BorderThickness="0,0.75,0,0" VerticalAlignment="Top" Background="{StaticResource tabUnselectedBrush}">
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" FlowDirection="RightToLeft">
        <Grid Grid.Row="0" Margin="0" FlowDirection="LeftToRight">
            <Grid.Resources>
                <ResourceDictionary>
                    <Style TargetType="{x:Type Border}">
                        <Setter Property="Background" Value="Transparent"/>
                        <Setter Property="BorderBrush" Value="{StaticResource tabBorderBrush}"/>
                        <Setter Property="BorderThickness" Value="0.75,0,0,1"/>
                        <Setter Property="TextBlock.Foreground" Value="Black"/>
                        <Setter Property="Padding" Value="4"/>
                        <Setter Property="Margin" Value="0"/>
                    </Style>
                </ResourceDictionary>
            </Grid.Resources>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Border x:Name="borderAccomodation" Tag="0" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="0"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='0'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemAccomodationText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemAccomodationFontWeight}" />
            </Border>
            <Border x:Name="borderAccomodationOthers" Tag="1" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="1"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='1'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemAccomodationOthersText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemAccomodationOthersFontWeight}" />
            </Border>
            <Border x:Name="borderAccomodationServices" Tag="2" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="2"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='2'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemAccomodationServicesText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemAccomodationServicesFontWeight}" />
            </Border>
            <Border x:Name="borderAttractions" Tag="3" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="3"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='3'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemAttractionsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemAttractionsFontWeight}" />
            </Border>
            <Border x:Name="borderMeals" Tag="4" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="4"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='4'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemMealsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemMealsFontWeight}" />
            </Border>
            <Border x:Name="borderParkings" Tag="5" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="5"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='5'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemParkingsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemParkingsFontWeight}" />
            </Border>
            <Border x:Name="borderBoardroom" Tag="6" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="6"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='6'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemBoardroomText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemBoardroomFontWeight}" />
            </Border>
            <Border x:Name="borderPrepaids" Tag="7" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="7"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='7'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemPrepaidsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemPrepaidsFontWeight}" />
            </Border>
            <Border x:Name="borderMinibar" Tag="8" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="8"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='8'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemMiniBarText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemMiniBarFontWeight}" />
            </Border>
            <Border x:Name="borderOthers" Tag="9" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="9"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='9'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemOthersText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemOthersFontWeight}" />
            </Border>
            <Border x:Name="borderServices" Tag="10" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="10"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='10'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemServiceText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemServiceFontWeight}" />
            </Border>
            <Border x:Name="borderProducts" Tag="11" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="11"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='11'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemProductsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemProductsFontWeight}" />
            </Border>
            <Border x:Name="borderClimate" Tag="12" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="12"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='12'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemClimateText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemClimateFontWeight}" />
            </Border>
            <Border x:Name="borderLongTimeChecks" Tag="13" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="13"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='13'}">
                <TextBlock Text="{lex:LocText SHot.Localization:UIStrings:txtCheckoutRozliczenieRachDlug}" FontWeight="Bold"/>
            </Border>
            <Border x:Name="borderParkingSale" Tag="14" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="14"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='14'}">
                <TextBlock Text="{lex:LocText SHot.Localization:UIStrings:txtCheckoutSprzedazParkingu}" FontWeight="Bold"/>
            </Border>
            <Border x:Name="borderAssets" Tag="15" PreviewMouseLeftButtonUp="borderPosition_PreviewMouseLeftButtonUp" Grid.Row="15"
            Background="{Binding ElementName=thisDialog, Path=SelectedPositionKind, Mode=OneWay, Converter={StaticResource tabSelectedBackgroundConverter}, ConverterParameter='15'}">
                <TextBlock Text="{Binding ElementName=thisDialog, Path=TabItemAssetsText}" FontWeight="{Binding ElementName=thisDialog, Path=TabItemAsetsFontWeight}" />
            </Border>

        </Grid>
    </ScrollViewer>
</Border>

imagescreenshot-20220328155355.png

0

Które linie na zrzucie ekranu są szersze? Bo nie wiem czy muszę się po okulary zgłosić czy nie rozumiem problemu ;D

0

@gswidwa1: Skopiuj sobie grafikę do np. Painta i mocno powiększ. Zauważysz wtedy, że każda linia to nie jest linia o szerokości 2 pikseli, z których każdy ma ten sam kolor tylko każda ma 3 piksele szerokości w których każda linia ma inny kolor. A górna linia (obramowująca od góry) jest już zupełnie w innym kolorze. A wszystkie linie mają zadany ten sam kolor. Różnice są drobne ale jednak.
Pytanie czemu WPF nie trzyma zadanego koloru?

0

W WPF width = 1 nie oznacza, że to jest 1 pixel

0

@gswidwa1: OK, ale skoro wszystkie linie mają zadaną ta samą szerokość to chyba powinny mieć taką samą. Ale mnie bardziej interesuje czemu one nie trzymają zadanego koloru tylko są jakby cieniowane?

0

Ja w VB.NET do rysowania grafiki czasem używam metody System.Drawing.Drawing2D.SmoothingMode
Decyduje ona o dokładności tworzenia grafiki. Stawiając kropkę po słowie 'Mode' dostaję do wyboru jedną z metod wygładzania.
Bez jej użycia grafika jest renderowana domyślnie tak, że jest jej krawędzie są "wygładzane średnio", czyli rysowana kreska składa się z zewnętrznych jaśniejszych linii i środkowej linii w ustawionym kolorze, co powoduje, że dla ludzkiego oka ta linia wydaje się doskonalsza. Po powiększeniu obrazu tak jak opisał przedmówca, widać to rozłożenie obrazu linii na odcienie. Można wybrać dokładniejszą metodę wygładzania, na przykład AntiAlias, albo inną w ogóle bez wygładzania.
Ja, co prawda, nie siedzę w WPF, ale wg mnie poszukaj w WPF metody System.Drawing.Drawing2D.SmoothingMode lub podobnie brzmiącej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1