C# 有两个理想画布,要绘制的代码相同,其中一个是空的

C# 有两个理想画布,要绘制的代码相同,其中一个是空的,c#,wpf,canvas,line,C#,Wpf,Canvas,Line,我最近开始探索WPF的世界,现在我正在编写一个编写吉他标签的程序。当你按下一个按钮时,喇叭就会出现。我希望你明白主要的意思。我有两个画布:在其中一个画布上我画了一系列的竖线和横线,在另一个画布上我画了标签。这是我的XAML代码: <Window x:Class="TabsPro.Natos" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sc

我最近开始探索WPF的世界,现在我正在编写一个编写吉他标签的程序。当你按下一个按钮时,喇叭就会出现。我希望你明白主要的意思。我有两个画布:在其中一个画布上我画了一系列的竖线和横线,在另一个画布上我画了标签。这是我的XAML代码:

<Window x:Class="TabsPro.Natos"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TabsPro"
        mc:Ignorable="d"
        Title="Natos" Height="372.049" Width="789.285">
    <Canvas>
        <Canvas Height="86" Width="600" Name="fretBoard" Background="Blue" Canvas.Left="100" Canvas.Top="24" Loaded="Natos_Loaded"/>
        <Canvas Height="114" Width="720" Name="tabs" Background="Green" Canvas.Left="33" Canvas.Top="165"/>
    </Canvas>
</Window>
InitiateTabGeneration方法只创建行和文本块,然后使用委托将这些内容传递给xaml.cs。然后我只是从列表中读取并将子对象添加到第二个画布。现在的问题是:行和文本块不会出现。IsVisible和IsLoaded给我“false”。然后我做了一个测试:在加载的方法中,我将水平线添加到第一个画布,将垂直线添加到第二个画布(我无法绘制的画布)。一切正常。然后,我尝试在加载第二个画布时添加子画布。再说一次,一切都很好。我做错了什么?在过去的两天里,我一直在寻找解决方案,但我唯一发现的是不透明度。我试着改变它的价值观,但没用

如果这是一个重复,我很抱歉,请给我一个链接到这个问题。另外,我是一个乞丐,我知道可能会有很多错误。我很感激任何关于应该做得更好的意见

另外,这是我的第一篇文章,如果有什么问题,请告诉我,这样我将来可以做得更好

祝你今天愉快

编辑:

蓝色帆布是装饰板。单击线条(fret)时,选项卡应显示在绿色画布上

EDIT2:

方法InitiateTabGeneration中的代码:

    for (int i = 0; i < 7; i++)
    {
        Line testLine = new Line();
        testLine.Visibility = Visibility.Visible;
        testLine.Stroke = silverBrush;
        testLine.StrokeThickness = 3;
        testLine.X1 = x1;
        testLine.X2 = x2;
        testLine.Y1 = y1;
        testLine.Y2 = y1;
        testLine.Name = "tab" + i.ToString();
        tabLineList.Add(testLine);

        x1 += 10;
        x2 += 10;
        y1 += 10;
    }

    TextBlock tbTest = new TextBlock();
    tbTest.Text = "1";
    Canvas.SetLeft(tbTest, (x2 - x1) / 2);
    Canvas.SetTop(tbTest, y1);

    PassTabs passTabs = new PassTabs(Notes.GetTabs);
    passTabs(tabLineList, tabNumber);
}
for(int i=0;i<7;i++)
{
测线=新线();
testLine.Visibility=可见性.Visibility;
Stroke=silverBrush;
testLine.StrokeThickness=3;
testLine.X1=X1;
testLine.X2=X2;
testLine.Y1=Y1;
testLine.Y2=y1;
testLine.Name=“tab”+i.ToString();
tabLineList.Add(测试线);
x1+=10;
x2+=10;
y1+=10;
}
TextBlock tbTest=新的TextBlock();
tbTest.Text=“1”;
Canvas.SetLeft(tbTest,(x2-x1)/2);
Canvas.SetTop(tbTest,y1);
PassTabs PassTabs=新的PassTabs(Notes.GetTabs);
密码表(TablInList、tabNumber);
}

这条线不是我在某人点击fret后生成的实际线。我写这些只是为了测试。

wpf中的FrameworkElement只能有一个。您是否为每个
画布
创建了两组不同的形状(
线条
s)?如果您是这样要求的,则每个“类型”线条都有单独的列表。您是否可以尝试用图像进行解释。完成。在我按下一个fret后,绿色画布仍然是空的。foreach循环已在列表中运行,但未显示任何内容。您能否发布
InitiateTabGeneration
方法的代码?你说那是创建线条和文本块的地方。我怀疑你的问题会出在那个方法的某个地方。
wpf中的FrameworkElement
只能有一个。您是否为每个
画布
创建了两组不同的形状(
线条
s)?如果您是这样要求的,则每个“类型”线条都有单独的列表。您是否可以尝试用图像进行解释。完成。在我按下一个fret后,绿色画布仍然是空的。foreach循环已在列表中运行,但未显示任何内容。您能否发布
InitiateTabGeneration
方法的代码?你说那是创建线条和文本块的地方。我怀疑你的问题就在于那种方法。
public void fretHL_MouseUp(object sender, MouseButtonEventArgs e)
{
    Line fretLine = sender as Line;
    ManageDatabase ManageDB = new ManageDatabase();
    PassFretName passFretName = new PassFretName(ManageDB.FretNameHandler);
    passFretName(fretLine.Name.ToString());
    GenerateDrawings generateDWGS = new GenerateDrawings();
    generateDWGS.InitiateTabGeneration();
    DrawTabs();
}
    for (int i = 0; i < 7; i++)
    {
        Line testLine = new Line();
        testLine.Visibility = Visibility.Visible;
        testLine.Stroke = silverBrush;
        testLine.StrokeThickness = 3;
        testLine.X1 = x1;
        testLine.X2 = x2;
        testLine.Y1 = y1;
        testLine.Y2 = y1;
        testLine.Name = "tab" + i.ToString();
        tabLineList.Add(testLine);

        x1 += 10;
        x2 += 10;
        y1 += 10;
    }

    TextBlock tbTest = new TextBlock();
    tbTest.Text = "1";
    Canvas.SetLeft(tbTest, (x2 - x1) / 2);
    Canvas.SetTop(tbTest, y1);

    PassTabs passTabs = new PassTabs(Notes.GetTabs);
    passTabs(tabLineList, tabNumber);
}