Имам <Grid>
, който съдържа някои вертикални и хоризонтални <Line>
. Искам решетката да може да се мащабира с размера на прозореца и да запази съотношението си, така че да се съдържа в <Viewbox Stretch="Uniform">
.
Искам обаче линиите винаги да се изобразяват с ширина 1 пиксел, така че използвам:
Line line = new Line();
line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
// other line settings here...
Това прави първоначалния вид на линиите идеален, но веднага щом започнете да преоразмерявате прозореца, разтягането/мащабирането започва и линиите отново стават смес от 1 и 2 пиксела с дебелина.
Има ли някакъв начин линиите винаги да са с дебелина 1 пиксел и също така да позволяват преоразмеряване на прозореца/решетката?
Актуализация - Използване на геометрията на пътя според предложението на Клеменс
@Clemens - Благодаря, че подчертахте разликите в изобразяването между линии и пътища. Докато се опитвам да преработя кода си, използвайки вашия пример, получавам онова потъващо чувство, че копая повече дупки за себе си и всъщност не схващам цялата концепция (изцяло моя грешка, не ваша, просто съм нов в WPF) .
Ще добавя няколко екранни снимки, за да илюстрирам следното описание:
Правя дъска за игра (за играта на Go, в случай че това помогне разберете оформлението изобщо). Имам решетка 9x9 и планирам да поставя фигурите на играта, като просто добавя елипса към определена клетка от мрежата.
За да начертая подлежащите линии на дъската обаче, трябва да начертая линии, пресичащи средата на клетките през цялата дъска (в Go фигурите се поставят върху пресечните точки, а не в средата на клетките).
Възможно е да използвам напълно грешен подход, моля, не се колебайте да ми кажете да започна отново по различен маршрут, вместо да хаквам в текущата структура.
Ето как го направих досега (добавям пътеките програмно, поради начина, по който се изчисляват координатите. Не съм сигурен дали всичко може да се направи в XAML):
XAML:
<Grid MinHeight="400" MinWidth="400" ShowGridLines="False" x:Name="boardGrid">
<Grid.Resources>
<ScaleTransform x:Key="transform"
ScaleX="{Binding ActualWidth, ElementName=boardGrid}"
ScaleY="{Binding ActualHeight, ElementName=boardGrid}" />
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<!-- more rows, 9 in total -->
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<!-- more columns, 9 in total -->
</Grid.ColumnDefinitions>
<!-- example game pieces -->
<Ellipse Stroke="Black" Fill="#333333" Grid.Row="3" Grid.Column="2" />
<Ellipse Stroke="#777777" Fill="#FFFFFF" Grid.Row="4" Grid.Column="4" />
</Grid>
C#:
int cols = 9;
int rows = 9;
// Draw horizontal lines
for (int row = 0; row < rows; row++)
{
var path = new System.Windows.Shapes.Path();
path.Stroke = Brushes.Black;
path.StrokeThickness = 1;
path.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
Grid.SetRow(path, row);
Grid.SetColumnSpan(path, cols);
Grid.SetZIndex(path, -1);
double cellWidth = boardGrid.ColumnDefinitions[0].ActualWidth;
double cellHeight = boardGrid.RowDefinitions[0].ActualHeight;
double x1 = (cellWidth / 2) / boardGrid.ActualWidth;
double y1 = (cellHeight / 2) / boardGrid.ActualHeight;
double x2 = ((cellWidth * cols) - (cellWidth / 2)) / boardGrid.ActualWidth;
double y2 = (cellHeight / 2) / boardGrid.ActualHeight;
path.Data = new LineGeometry(new Point(x1, y1),
new Point(x2, y2),
(ScaleTransform)boardGrid.TryFindResource("transform"));
boardGrid.Children.Add(path);
}
// Similar loop code follows for vertical lines...
Това е, което получавам, когато използвам кода по-горе
До голяма степен така искам да изглежда. Повдигнаха ми още 2 въпроса:
1) Възприемам ли правилния подход, когато изчислявам стойностите x1
, x2
, y1
и y2
, като ги разделям с общата ширина на дъската, за да създам число между 0 и 1, така че ScaleTransform да може след това да се приложи към тях?
2) След като вече не използвам Viewbox
, как да постигна мащабиране с фиксирано съотношение? Ако увелича прозореца си, дъската се разтяга непропорционално (вижте изображението по-долу). (Въпреки това вече не изглажда линиите, което е страхотно.)
Знам, че това ще стане малко монолитен пост. Много съм благодарен за търпението и отговорите.