Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Načtení faviconu webu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Načtení faviconu webu

Autor: SuperMartas ♂

13:19:59 02.01.2013

Ahoj.
Díky za rady, už se mi to podařilo rozchodit :)

Citovat příspěvek

 

Re: Načtení faviconu webu

Autor: JardaJirava ♂

14:36:24 31.12.2012

Ahoj,

problme je v cross thread komunikaci. Komunikaci s UI prvky musis synchronizovat pres Dispatcher.

Pekny den,

Citovat příspěvek

 

Re: Načtení faviconu webu

Autor: SuperMartas ♂

12:24:52 29.12.2012

Ahoj.
Tak jsem přišel na příčinu, proč to nechce fungovat. Je to tím, že tu ikonku stahuji v jiném vlákně:
...
BackgroundWorker vlákno = new BackgroundWorker();
vlákno.DoWork += (x, y) =>
{
ZapišDoStavovéhoŘádku("Připojuji se k serveru " + adresaKanálu);
kanál.NasatavVýchozíHodnoty();

ZapišDoStavovéhoŘádku("Načítám ikonku kanálu " + kanál.Titulek);
kanál.NačtiFavicon();

ZapišDoStavovéhoŘádku("Načítám položky kanálu " + kanál.Titulek);
kanál.NačtiPoložky();
};
...
Pokud jsem celý kód přesunul do hlavního vlákna, vše fungovalo bez problémů a ikonka webu se zobrazila. Ale pokud je to ve vedlejším vlákně, tak to nefunguje. Navíc mi to v poslední době začalo padat kvůli této výjimce:

Neošetřená výjimka: System.ArgumentException: Nutno vytvořit závislý zdroj Depen
dencySource ve stejném vlákně jako závislý objekt DependencyObject.
v System.Windows.DependencyObject.ValidateSources(DependencyObject d, Depende
ncySource[] newSources, Expression expr)
v System.Windows.Expression.ChangeSources(DependencyObject d, DependencyPrope
rty dp, DependencySource[] newSources)
v System.Windows.Data.BindingExpressionBase.ChangeSources(DependencyObject ta
rget, DependencyProperty dp, WeakDependencySource[] newSources)
v System.Windows.Data.BindingExpressionBase.ChangeSources(WeakDependencySourc
e[] newSources)
v System.Windows.Data.BindingExpression.ChangeWorkerSources(WeakDependencySou
rce[] newWorkerSources, Int32 n)
v MS.Internal.Data.ClrBindingWorker.ReplaceDependencySources()
v MS.Internal.Data.ClrBindingWorker.NewValueAvailable(Boolean dependencySourc
esChanged, Boolean initialValue, Boolean isASubPropertyChange)
v MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollec
tionView collectionView, Object newValue, Boolean isASubPropertyChange)
v MS.Internal.Data.ClrBindingWorker.AttachDataItem()
v System.Windows.Data.BindingExpression.Activate(Object item)
v System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt
)
v System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClien
t.AttachToContext(Boolean lastChance)
v MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
v MS.Internal.Data.DataBindEngine.Run(Object arg)
v MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)

v System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
v System.Windows.ContextLayoutManager.UpdateLayout()
v System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
v System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
v System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
v System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCo
mpositionTarget)
v System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompos
itionTarget)
v System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedComposit
ionTarget)
v System.Windows.Interop.HwndTarget.OnResize()
v System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr w
param, IntPtr lparam)
v System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int3
2 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
v MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr
lParam, Boolean& handled)
v MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
v System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callbac
k, Object args, Int32 numArgs)
v MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Del
egate method, Object args, Int32 numArgs, Delegate catchHandler)
v System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority pri
ority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
v MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam
, IntPtr lParam)

Pokud stažení ikonky odstraním, vše funguje naprosto bez problémů. Nevíte, čím by to mohlo být?

Citovat příspěvek

 

Re: Načtení faviconu webu

Autor: JardaJirava ♂

10:50:43 27.12.2012

Ahoj,

zkusil bych zjistit, kde je chyba. Vidim tyto potencialni moznosti, pokud spravne nactes stranku.

Je spatne zapsany regex pro ziskani url pro favicon, nebo neni tato url kompletni a tak se dotazujes na spatne URL pro stazeni.

Pokud se ti ikona stahuje spravne, ale nezobrazuje se, potom mas spatne zapsany binding. Prirazujes do tridni promenne a WPF potrebuje byt notifikovano o zmene. Tj. prirazeni by melo vygenerovat event NotifyPropertyChanged.

Pekny den,

Citovat příspěvek

 

Načtení faviconu webu

Autor: SuperMartas ♂

13:00:37 22.12.2012

Dobrý den.
Pracuji na programu, ve které potřebuji získat favicon webu. Nevím proč, ale pořád mi to nechce fungovat.

Mám metodu "NačtiFavicon", která by měla favicon načíst:

private BitmapImage favicon = new BitmapImage(new Uri("/RSS čtečka;component/Okna/Obrázky/Kanál.png", UriKind.Relative));

public void NačtiFavicon()
{
Uri urlProDotaz = new Uri(this.Adresa);
WebRequest dotaz = WebRequest.Create("http://" + urlProDotaz.Host);
string obsah = String.Empty;

using (WebResponse odpověď = dotaz.GetResponse())
{
using (Stream stream = odpověď.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream))
{
obsah = reader.ReadToEnd();
}
}
}

if (!String.IsNullOrEmpty(obsah))
{
Match matchAdresyIkonky = Regex.Match(Regex.Match(obsah, "<link .*?rel=\"shortcut icon\".*?>", RegexOptions.IgnoreCase).Value, "href=\"(.*?)\"");

if (matchAdresyIkonky.Success)
{
this.favicon = new BitmapImage(new Uri(new Uri("http://" + urlProDotaz.Host), matchAdresyIkonky.Groups[1].Value));
}
}
}

....

<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Favicon}" Width="14" Height="14" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Zajímavé je, že pokud se nenačítá favicon z webu, ale použije se defaultní, tedy "/RSS čtečka;component/Okna/Obrázky/Kanál.png", vše funguje. Jenže pokud se má načítat favicon z webu, tak se tam nikdy nezobrazí. Zkoušel jsem už spoustu postupů, hledal jsem na Googlu, ale na nic mi nefungovalo. Nevíte, čím by to mohlo být?
Předem díky za odpověď.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: