以编程方式绘制非静态矩形

时间:2015-04-24 05:33:51

标签: c# wpf

我正在尝试在WPF中绘制非静态(可变宽度高度x y)填充矩形。我有使用Winforms的经验,但我之前从未使用过WPF。这就是我在WinForm中使用GDI +绘图调用所做的事情。

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(_brush1, _rect1);
}

此外,每当我更改this.Invalidate()属性时,我都会致电_rect1

我在这件事上看到的所有“教程”只是在.xaml文件中绘制静态非填充矩形(或者他们没有提到节目代码的位置......)。

我知道WPF的绘画作品有所不同,我只是不明白。我找到了similar method protected override void OnRender(DrawingContext dc),并尝试在我创建项目public partial class MainWindow : Window时添加的默认类中添加此项,但屏幕上没有绘制任何内容。我担心的另一件事是,DrawingContext类只有DrawRectangle类,而且没有FillRectangle

我怎样才能有效地画出这样的东西?

2 个答案:

答案 0 :(得分:0)

您不想在WPF中覆盖OnRender。从技术上讲,你当然可以,但它带来了很多问题,而且一般不推荐。

我要做的是在窗口上有一个面板,理想情况下是Canvas,然后创建一个Rectangle对象,然后您可以从代码隐藏中操作(或者,更好的是,使用数据捆绑)。如果您将其放在Canvas中,则可以通过更改其WidthHeight以及附加的属性Canvas.LeftCanvas.Top来操纵其大小和位置。< / p>

如果不了解您的具体情况,很难提供更具体的建议。

编辑:This相关问题有一些很好的答案和例子。

答案 1 :(得分:0)

这不是你应该使用WPF的方式。它有另一种创造图形的哲学。但是,如果您正在寻找一种类似于Windows Forms方式的方法,您可以使用它:

public class CountryFragment extends Fragment {

    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_social, container, false);

        displayListView();

        return view;
        }

    private void displayListView() {

        //Array list of countries
        List<String> countryList = new ArrayList<String>();
        countryList.add("Country 1");
        countryList.add("Country 2");
        countryList.add("Country 3");
        countryList.add("Country 4");
        countryList.add("Country 5");

        //create an ArrayAdapter from the String Array
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(),
                R.layout.adapter_social, countryList);
        ListView listView = (ListView) view.findViewById(R.id.listCountry);

        // Assign adapter to ListView
        listView.setAdapter(dataAdapter);

        //enables filtering for the contents of the given ListView
        listView.setTextFilterEnabled(true);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                switch( position )
                {
                    case 0:
                        Toast.makeText(getActivity(), "Country 1", Toast.LENGTH_SHORT).show();
                        break;
                        .....
                }
            }
        });
    }
}

如您所见,您必须将背景设置为透明。