2010-02-09 13 views
5

W normalnym C# łatwo zwrócić bitmapy stosując metodę Grpahics.DrawString(). Silverlight prawdopodobnie pozbył się obiektów bitmapowych i grafika nie jest już dostępna. Więc ... W jaki sposób mam manipulować/tworzyć bitmapę podczas korzystania z Silverlight? Jeśli to nie pomaga, używam Silverlight 3.Jak narysować ciąg bitmap w Silverlight?

Powiem ci, co robię. Dostaję szablon, w zasadzie wstępnie renderowany obraz. Użytkownik może następnie wybierać spośród wielu obrazów i wprowadzać poprawiony tekst. Następnie renderuję obraz, dostosowuję rozmiar itp. W granicach i wycentrowuję go w predefiniowanym obszarze obrazu. Jeśli mogę obliczyć wielkość (jak w metodzie MeasureString), a następnie narysować ciąg (jak w metodzie Graphics.DrawString), że będzie dobrze. Prawdziwe pytanie, bez względu na to, dlaczego chcę to zrobić, czy można to zrobić?

+2

Zawsze istnieje obawa ze strony osób udzielających porad, które są odpowiednie dla danego problemu. Niewiedza, że ​​ktoś chce coś zrobić (zwłaszcza coś, co wydaje się nierozważne na powierzchni), sprawia, że ​​czujemy się nieswojo.Podanie przyczyny __why__ może umożliwić komuś udostępnienie bardziej ostatecznego rozwiązania, którego jeszcze nie uwzględniłeś. – AnthonyWJones

Odpowiedz

3

Pytanie brzmi: dlaczego nie chcesz? Dlaczego po prostu nie użyć TextBlock?

Jeśli próbujesz dynamicznie generować obraz, użyj standardowych kontrolek Silverlight/WPF (w tym TextBlock) i render je do WritableBitmap.

Edit:

Ok, masz zaktualizowane i rozszerzone, które daje mi więcej, aby przejść dalej. Niestety, nie spodoba ci się odpowiedź. Po pierwsze, należy pamiętać, że Silverlight i WPF są na ogół oparte na wektorach i mają być używane jako takie. Chociaż płótno pozwala na manipulowanie pseudopikselami, nie można być tak dokładnym w pikselach jak GDI w starej szkole. To jest czynnik twojego medium. Jeśli koniecznie musisz zmierzyć rzeczy w taki sposób, w jaki chcesz je zmierzyć, sugeruję, żebyś budował swoje obrazy na zdalnym serwerze i przesyłał je do aplikacji Silverlight.

można obliczyć wielkość na ekranie tekstu wydanego przez TextBlock przy użyciu właściwości ActualWidth i ActualHeight. Ale działa tylko na już wyrenderowanej kontroli. Coś jak MeasureString jest po prostu niedostępne w Silverlight. Na podstawie Twojego opisu aplikacji niektóre interakcje z użytkownikami mogą osiągnąć to, czego potrzebujesz. Użytkownik wybiera obraz, wprowadza tekst i wyświetla podgląd. Użytkownik może następnie dopasować szerokość i wysokość różnych obszarów tekstowych, dopóki nie zostaną spełnione, i wtedy można zrobić migawkę za pomocą metody renderowania, którą lubiłem wyżej.

+0

OK ... Więc jak miałbym to zrobić? Pozwól, że ci powiem, co robię. Dostaję szablon, w zasadzie wstępnie renderowany obraz. Użytkownik może następnie wybierać spośród wielu obrazów i wprowadzać poprawiony tekst. Następnie renderuję obraz, dostosowuję rozmiar itp. W granicach i wycentrowuję go w predefiniowanym obszarze obrazu. Jeśli potrafię obliczyć rozmiar (jak w metodzie MeasureString), a następnie narysować podany ciąg (jak w metodzie Graphics.DrawString) przy użyciu twojej techniki to byłoby dobrze. Prawdziwe pytanie, bez względu na to, dlaczego chcę to zrobić, czy można to zrobić? – Spenduku

+0

@ Spencer: powinieneś przenieść ten komentarz na swoje pytanie. –

+0

Odpowiedź nie jest tym, na co liczyłem, ale wydaje się, że jest to jedyny możliwy sposób. Więc dziękuję! :) – Spenduku

3

Następujące mogą działać, jest nieco mglisty, ponieważ sam nie próbowałem.

Przedmiotem szukasz jest WritableBitmap.

Tworzysz wizualne drzewo, na przykład utwórz własne Grid lub Canvas (nie dodajesz tego do interfejsu użytkownika). Dodaj do niego wybrany obraz i pozycję TextBlock ustawioną i dopasowaną według uznania.

Utwórz nowy WritableBitmap o określonym rozmiarze lub używając wybranego obrazu, aby go zainicjować.

pomocą WritableBitmapRender sposób przepuszczenie nad pierwiastek Grid lub Canvas do niego.

Teraz masz bitmapę, którą powinieneś użyć, aby zrobić to, co musisz zrobić, co wymagało całego tego skoku w pierwszej kolejności.

Powiązane problemy