Margin blok teks menyebabkan teks di luar batas

Saat ini saya sedang mencoba membuat komponen visual untuk memiliki teks bergulir (kiri ke kanan dan kanan ke kiri) - hampir seperti tenda html.

Saya memiliki grid yang dibagi menjadi beberapa kolom & baris, dan saya ingin menempatkan komponen saya di dalam salah satu slot grid.

Grid (bernama UIGrid) dihasilkan seperti ini:

for (int i = 0; i < xDivisions; i++)
{
    ColumnDefinition newColumn = new ColumnDefinition();
    UIGrid.ColumnDefinitions.Add(newColumn);
}
for (int i = 0; i < yDivisions; i++)
{
    RowDefinition newRow = new RowDefinition();
    UIGrid.RowDefinitions.Add(newRow);
}

Komponen yang saya tambahkan hanyalah pembatas dengan blok teks saat masih anak-anak. Saya menempatkan perbatasan di dalam Grid seperti ini:

border = new Border();
Grid.SetColumn(border, xPosition);
Grid.SetRow(border, yPosition);

textBlock = new TextBlock();
border.Child = textBlock;
textBlock.Text = "Scrolling text from left to right";

UIGrid.Children.Add(border);

Saya menggunakan pengatur waktu untuk menambah margin blok teks, inilah isi panggilan balik pengatur waktu yang disederhanakan:

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double textWidth = textBlock.DesiredSize.Width;
double visibleWidth = componentBase.ActualWidth;
double targetMargin = textWidth < visibleWidth ? visibleWidth : textWidth;

if (margin.Left == targetMargin)
{
    margin.Left = -textWidth;
} else
{
    margin.Left++;
}

Ketika teks digeser dari kiri ke kanan, teks berperilaku baik : https://s10.postimg.org/p0nt7vl09/text_good.png Teks "meninggalkan" slot kisi disembunyikan.

Namun, ketika saya mengatur margin blok teks sebagai negatif sehingga dapat kembali ke dalam area tampilan dari kiri, teks tetap terlihat meskipun berada di luar slot yang dialokasikan: https://s10.postimg.org/pownqtjq1/text_bad.png

Saya sudah mencoba menggunakan padding, tetapi saya tidak dapat menyetel padding negatif. Saya sudah mencoba beberapa hal lainnya, namun saya merasa menemui hambatan.

Apa yang bisa saya lakukan untuk mendapatkan teks bergulir dengan baik?


person Valentin Schneider    schedule 11.08.2016    source sumber
comment
Alangkah baiknya jika Anda memposting grid xaml sehingga kami dapat melihat apa yang sebenarnya terjadi. untuk saat ini coba atur Alignment horizontal Textblock di dalam Grid menjadi Stretch   -  person AVK    schedule 11.08.2016
comment
@AVKNaidu Mengubah perataan horizontal Textblock atau Border tidak mengubah perilaku pengguliran =(   -  person Valentin Schneider    schedule 11.08.2016
comment
Saya ingin tahu mengapa Anda begitu paranoid dalam berbagi kode atau mengatakan dengan jelas apa masalah Anda sebenarnya. Bagaimanapun, temukan kontrol terluar Anda (saya pikir itu mungkin Grid) dan atur ClipToBounds="True" di atasnya. Itu mungkin menyelesaikan setidaknya sebagian dari masalah Anda, meskipun sulit untuk memastikannya karena Anda sangat tertutup.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 11.08.2016
comment
@EdPlunkett Oh ini tidak terlalu rahasia, saya hanya tidak ingin membuang semua kode saya dan berkata di sini, tolong debug ini. Saya akui saya bisa menunjukkan lebih banyak kode di sini, minus poin bagi saya. Sedangkan untuk 'ClipToBounds' sepertinya tidak ada properti seperti itu di UWP, yang ada hanya properti 'Clip' berbentuk persegi panjang yang harus saya atur sendiri. Saya masih berjuang dengannya.   -  person Valentin Schneider    schedule 12.08.2016


Jawaban (2)


Jika Anda ingin menggulir teks dengan baik, ListView mungkin merupakan pilihan yang lebih baik. Ini dinamis dan Anda dapat mengikatnya ke objek Anda. Butuh banyak tebakan untuk berhasil.

person Phia-CM    schedule 11.08.2016

Ed Plunkett membawa saya ke arah yang benar dengan properti Clip. Idenya adalah untuk melakukan ini:

border.Clip = new RectangleGeometry
{
    Rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight)
};

Tentu saja, itu tidak berfungsi jika perbatasan belum dirender (dan tentu saja tidak saat kode saya berjalan). Anda dapat memaksa pengukuran dilakukan menggunakan 'Ukur' seperti yang saya lakukan untuk mengukur panjang teks dalam piksel, tetapi perilakunya aneh di tepi saya. Saya tidak akan mendapatkan ukuran yang benar sama sekali.

Pada akhirnya, saya cukup berlangganan acara SizeChanged di perbatasan:

border.SizeChanged += OnSizeComputed;

Saat acara itu diaktifkan, saya membuat RectangleGeometry menggunakan ActualWidth & ActualHeight.

person Valentin Schneider    schedule 12.08.2016